diff --git a/cdn-server/cdn/src/index.ts b/cdn-server/cdn/src/index.ts index 6c2ad55a21..78ae5b096b 100644 --- a/cdn-server/cdn/src/index.ts +++ b/cdn-server/cdn/src/index.ts @@ -52,6 +52,7 @@ declare module 'hono' { interface ContextVariableMap { authenticatedOrganizationId: string; authenticatedFederatedGraphId: string; + authenticatedFeatures: string[]; } } @@ -102,6 +103,19 @@ const jwtMiddleware = (secret: string | ((c: Context) => string)) => { c.set('authenticatedFederatedGraphId', federatedGraphId as string); } + const features = result.payload.features; + c.set('authenticatedFeatures', Array.isArray(features) ? (features as string[]) : []); + + await next(); + }; +}; + +const requireFeature = (feature: string) => { + return async (c: Context, next: Next) => { + const features = c.get('authenticatedFeatures'); + if (!features || !features.includes(feature)) { + return c.text('Forbidden - Missing required feature', 403); + } await next(); }; }; @@ -353,6 +367,59 @@ const subgraphChecks = (storage: BlobStorage) => { }; }; +const manifestBlob = (storage: BlobStorage, keyBuilder: (orgId: string, graphId: string, c: Context) => string) => { + return async (c: Context) => { + const organizationId = c.get('authenticatedOrganizationId'); + const federatedGraphId = c.get('authenticatedFederatedGraphId'); + + if (organizationId !== c.req.param('organization_id') || federatedGraphId !== c.req.param('federated_graph_id')) { + return c.text('Bad Request', 400); + } + + const key = keyBuilder(organizationId, federatedGraphId, c); + + const body = await c.req.json(); + + let isModified = true; + + if (body?.version) { + try { + isModified = await storage.headObject({ context: c, key, version: body.version }); + } catch (e: any) { + if (e instanceof BlobNotFoundError) { + return c.notFound(); + } + throw e; + } + } + + if (!isModified) { + return c.body(null, 304); + } + + let blobObject: BlobObject; + + try { + blobObject = await storage.getObject({ context: c, key, cacheControl: 'no-cache' }); + + if (blobObject.metadata && blobObject.metadata['signature-sha256']) { + c.header(signatureSha256Header, blobObject.metadata['signature-sha256']); + } + } catch (e: any) { + if (e instanceof BlobNotFoundError) { + return c.notFound(); + } + throw e; + } + + c.header('Content-Type', 'application/json; charset=UTF-8'); + + return stream(c, async (stream) => { + await stream.pipe(blobObject.stream); + }); + }; +}; + // eslint-disable-next-line @typescript-eslint/ban-types export const cdn = ( hono: Hono, @@ -391,4 +458,35 @@ export const cdn = `${orgId}/${graphId}/manifest/mapper.json`), + ); + + const manifestLatestPath = '/:organization_id/:federated_graph_id/manifest/latest.json'; + hono + .use(manifestLatestPath, jwtMiddleware(opts.authJwtSecret)) + .use(manifestLatestPath, requireFeature('split-config-loading')) + .post( + manifestLatestPath, + manifestBlob(opts.blobStorage, (orgId, graphId) => `${orgId}/${graphId}/manifest/latest.json`), + ); + + const manifestFeatureFlagPath = + '/:organization_id/:federated_graph_id/manifest/feature-flags/:feature_flag_name{.+\\.json$}'; + hono + .use(manifestFeatureFlagPath, jwtMiddleware(opts.authJwtSecret)) + .use(manifestFeatureFlagPath, requireFeature('split-config-loading')) + .post( + manifestFeatureFlagPath, + manifestBlob( + opts.blobStorage, + (orgId, graphId, c) => `${orgId}/${graphId}/manifest/feature-flags/${c.req.param('feature_flag_name')}`, + ), + ); }; diff --git a/cdn-server/cdn/test/cdn.test.ts b/cdn-server/cdn/test/cdn.test.ts index 9e2eec6e87..3a1ecef73f 100644 --- a/cdn-server/cdn/test/cdn.test.ts +++ b/cdn-server/cdn/test/cdn.test.ts @@ -7,11 +7,21 @@ import { BlobStorage, BlobNotFoundError, cdn, BlobObject, signatureSha256Header const secretKey = 'hunter2'; const secretAdmissionKey = 'hunter3'; -const generateToken = async (organizationId: string, federatedGraphId: string | undefined, secret: string) => { +const generateToken = async ( + organizationId: string, + federatedGraphId: string | undefined, + secret: string, + features?: string[], +) => { const secretKey = new TextEncoder().encode(secret); - return await new SignJWT({ organization_id: organizationId, federated_graph_id: federatedGraphId }) - .setProtectedHeader({ alg: 'HS256' }) - .sign(secretKey); + const payload: Record = { + organization_id: organizationId, + federated_graph_id: federatedGraphId, + }; + if (features !== undefined) { + payload.features = features; + } + return await new SignJWT(payload).setProtectedHeader({ alg: 'HS256' }).sign(secretKey); }; class InMemoryBlobStorage implements BlobStorage { @@ -844,4 +854,235 @@ describe('CDN handlers', () => { expect(res.status).toBe(404); }); }); + + describe('Test manifest endpoints (split-config-loading)', async () => { + const federatedGraphId = 'federatedGraphId'; + const organizationId = 'organizationId'; + const tokenWithFeature = await generateToken(organizationId, federatedGraphId, secretKey, ['split-config-loading']); + const tokenNoFeature = await generateToken(organizationId, federatedGraphId, secretKey); + const tokenWrongFeature = await generateToken(organizationId, federatedGraphId, secretKey, ['other-feature']); + const blobStorage = new InMemoryBlobStorage(); + + const mapperContents = JSON.stringify({ graphConfigs: { '': 'hash-base' } }); + const latestContents = JSON.stringify({ version: 'v1', engineConfig: {} }); + const featureFlagContents = JSON.stringify({ version: 'v1', engineConfig: { featureFlag: true } }); + + blobStorage.objects.set(`${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + buffer: Buffer.from(mapperContents), + metadata: { version: 'v1', 'signature-sha256': 'sig-mapper' }, + }); + + blobStorage.objects.set(`${organizationId}/${federatedGraphId}/manifest/latest.json`, { + buffer: Buffer.from(latestContents), + metadata: { version: 'v1' }, + }); + + blobStorage.objects.set(`${organizationId}/${federatedGraphId}/manifest/feature-flags/my-flag.json`, { + buffer: Buffer.from(featureFlagContents), + metadata: { version: 'v1' }, + }); + + const app = new Hono(); + + cdn(app, { + authJwtSecret: secretKey, + authAdmissionJwtSecret: secretAdmissionKey, + blobStorage, + }); + + describe('feature gate authorization', () => { + test('returns 403 when features claim is missing from JWT', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenNoFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(403); + }); + + test('returns 403 when features claim does not include split-config-loading', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWrongFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(403); + }); + + test('returns 403 for latest.json without feature', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/latest.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenNoFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(403); + }); + + test('returns 403 for feature-flags without feature', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/feature-flags/my-flag.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenNoFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(403); + }); + }); + + describe('JWT authentication', () => { + test('returns 401 with no token', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + }); + expect(res.status).toBe(401); + }); + + test('returns 401 with invalid token', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature.slice(0, -1)}}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(401); + }); + + test('returns 401 with expired token', async () => { + const expiredToken = await new SignJWT({ + organization_id: organizationId, + federated_graph_id: federatedGraphId, + features: ['split-config-loading'], + exp: Math.floor(Date.now() / 1000) - 60, + }) + .setProtectedHeader({ alg: 'HS256' }) + .sign(new TextEncoder().encode(secretKey)); + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${expiredToken}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(401); + }); + }); + + describe('mapper.json', () => { + test('returns mapper blob content with correct headers', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(200); + expect(res.headers.get('Content-Type')).toBe('application/json; charset=UTF-8'); + expect(res.headers.get(signatureSha256Header)).toBe('sig-mapper'); + expect(await res.text()).toBe(mapperContents); + }); + + test('returns 304 when version matches', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: 'v1' }), + }); + expect(res.status).toBe(304); + }); + + test('returns 404 when blob does not exist', async () => { + const emptyStorage = new InMemoryBlobStorage(); + const otherApp = new Hono(); + cdn(otherApp, { + authJwtSecret: secretKey, + authAdmissionJwtSecret: secretAdmissionKey, + blobStorage: emptyStorage, + }); + + const res = await otherApp.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(404); + }); + + test('returns 400 when org/graph ID mismatch', async () => { + const res = await app.request(`/wrong-org/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(400); + }); + }); + + describe('latest.json', () => { + test('returns latest manifest blob content', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/latest.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(200); + expect(res.headers.get('Content-Type')).toBe('application/json; charset=UTF-8'); + expect(await res.text()).toBe(latestContents); + }); + + test('returns 304 when version matches', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/latest.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: 'v1' }), + }); + expect(res.status).toBe(304); + }); + + test('returns 404 when blob does not exist', async () => { + const emptyStorage = new InMemoryBlobStorage(); + const otherApp = new Hono(); + cdn(otherApp, { + authJwtSecret: secretKey, + authAdmissionJwtSecret: secretAdmissionKey, + blobStorage: emptyStorage, + }); + + const res = await otherApp.request(`/${organizationId}/${federatedGraphId}/manifest/latest.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(404); + }); + }); + + describe('feature-flags/:name.json', () => { + test('returns feature flag blob content', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/feature-flags/my-flag.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(200); + expect(res.headers.get('Content-Type')).toBe('application/json; charset=UTF-8'); + expect(await res.text()).toBe(featureFlagContents); + }); + + test('returns 304 when version matches', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/feature-flags/my-flag.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: 'v1' }), + }); + expect(res.status).toBe(304); + }); + + test('returns 404 when blob does not exist', async () => { + const res = await app.request( + `/${organizationId}/${federatedGraphId}/manifest/feature-flags/nonexistent.json`, + { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }, + ); + expect(res.status).toBe(404); + }); + }); + }); }); diff --git a/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go b/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go index 4fd613b98a..47292954d7 100644 --- a/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go +++ b/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go @@ -29132,6 +29132,150 @@ func (x *RecomposeGraphResponse) GetErrorCounts() *SubgraphPublishStats { return nil } +type RecomposeFeatureFlagRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + DisableResolvabilityValidation *bool `protobuf:"varint,5,opt,name=disable_resolvability_validation,json=disableResolvabilityValidation,proto3,oneof" json:"disable_resolvability_validation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RecomposeFeatureFlagRequest) Reset() { + *x = RecomposeFeatureFlagRequest{} + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[445] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RecomposeFeatureFlagRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecomposeFeatureFlagRequest) ProtoMessage() {} + +func (x *RecomposeFeatureFlagRequest) ProtoReflect() protoreflect.Message { + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[445] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecomposeFeatureFlagRequest.ProtoReflect.Descriptor instead. +func (*RecomposeFeatureFlagRequest) Descriptor() ([]byte, []int) { + return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{445} +} + +func (x *RecomposeFeatureFlagRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RecomposeFeatureFlagRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *RecomposeFeatureFlagRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *RecomposeFeatureFlagRequest) GetDisableResolvabilityValidation() bool { + if x != nil && x.DisableResolvabilityValidation != nil { + return *x.DisableResolvabilityValidation + } + return false +} + +type RecomposeFeatureFlagResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Response *Response `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` + CompositionErrors []*CompositionError `protobuf:"bytes,2,rep,name=compositionErrors,proto3" json:"compositionErrors,omitempty"` + DeploymentErrors []*DeploymentError `protobuf:"bytes,3,rep,name=deploymentErrors,proto3" json:"deploymentErrors,omitempty"` + CompositionWarnings []*CompositionWarning `protobuf:"bytes,4,rep,name=compositionWarnings,proto3" json:"compositionWarnings,omitempty"` + ErrorCounts *SubgraphPublishStats `protobuf:"bytes,5,opt,name=errorCounts,proto3,oneof" json:"errorCounts,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RecomposeFeatureFlagResponse) Reset() { + *x = RecomposeFeatureFlagResponse{} + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[446] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RecomposeFeatureFlagResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecomposeFeatureFlagResponse) ProtoMessage() {} + +func (x *RecomposeFeatureFlagResponse) ProtoReflect() protoreflect.Message { + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[446] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecomposeFeatureFlagResponse.ProtoReflect.Descriptor instead. +func (*RecomposeFeatureFlagResponse) Descriptor() ([]byte, []int) { + return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{446} +} + +func (x *RecomposeFeatureFlagResponse) GetResponse() *Response { + if x != nil { + return x.Response + } + return nil +} + +func (x *RecomposeFeatureFlagResponse) GetCompositionErrors() []*CompositionError { + if x != nil { + return x.CompositionErrors + } + return nil +} + +func (x *RecomposeFeatureFlagResponse) GetDeploymentErrors() []*DeploymentError { + if x != nil { + return x.DeploymentErrors + } + return nil +} + +func (x *RecomposeFeatureFlagResponse) GetCompositionWarnings() []*CompositionWarning { + if x != nil { + return x.CompositionWarnings + } + return nil +} + +func (x *RecomposeFeatureFlagResponse) GetErrorCounts() *SubgraphPublishStats { + if x != nil { + return x.ErrorCounts + } + return nil +} + type GetOnboardingRequest struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -29140,7 +29284,7 @@ type GetOnboardingRequest struct { func (x *GetOnboardingRequest) Reset() { *x = GetOnboardingRequest{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[445] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[447] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29152,7 +29296,7 @@ func (x *GetOnboardingRequest) String() string { func (*GetOnboardingRequest) ProtoMessage() {} func (x *GetOnboardingRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[445] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[447] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29165,7 +29309,7 @@ func (x *GetOnboardingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOnboardingRequest.ProtoReflect.Descriptor instead. func (*GetOnboardingRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{445} + return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{447} } type GetOnboardingResponse struct { @@ -29182,7 +29326,7 @@ type GetOnboardingResponse struct { func (x *GetOnboardingResponse) Reset() { *x = GetOnboardingResponse{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[446] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[448] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29194,7 +29338,7 @@ func (x *GetOnboardingResponse) String() string { func (*GetOnboardingResponse) ProtoMessage() {} func (x *GetOnboardingResponse) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[446] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[448] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29207,7 +29351,7 @@ func (x *GetOnboardingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOnboardingResponse.ProtoReflect.Descriptor instead. func (*GetOnboardingResponse) Descriptor() ([]byte, []int) { - return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{446} + return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{448} } func (x *GetOnboardingResponse) GetResponse() *Response { @@ -29262,7 +29406,7 @@ type CreateOnboardingRequest struct { func (x *CreateOnboardingRequest) Reset() { *x = CreateOnboardingRequest{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[447] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[449] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29274,7 +29418,7 @@ func (x *CreateOnboardingRequest) String() string { func (*CreateOnboardingRequest) ProtoMessage() {} func (x *CreateOnboardingRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[447] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[449] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29287,7 +29431,7 @@ func (x *CreateOnboardingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateOnboardingRequest.ProtoReflect.Descriptor instead. func (*CreateOnboardingRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{447} + return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{449} } func (x *CreateOnboardingRequest) GetSlack() bool { @@ -29317,7 +29461,7 @@ type CreateOnboardingResponse struct { func (x *CreateOnboardingResponse) Reset() { *x = CreateOnboardingResponse{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[448] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[450] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29329,7 +29473,7 @@ func (x *CreateOnboardingResponse) String() string { func (*CreateOnboardingResponse) ProtoMessage() {} func (x *CreateOnboardingResponse) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[448] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[450] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29342,7 +29486,7 @@ func (x *CreateOnboardingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateOnboardingResponse.ProtoReflect.Descriptor instead. func (*CreateOnboardingResponse) Descriptor() ([]byte, []int) { - return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{448} + return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{450} } func (x *CreateOnboardingResponse) GetResponse() *Response { @@ -29388,7 +29532,7 @@ type FinishOnboardingRequest struct { func (x *FinishOnboardingRequest) Reset() { *x = FinishOnboardingRequest{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[449] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[451] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29400,7 +29544,7 @@ func (x *FinishOnboardingRequest) String() string { func (*FinishOnboardingRequest) ProtoMessage() {} func (x *FinishOnboardingRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[449] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[451] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29413,7 +29557,7 @@ func (x *FinishOnboardingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FinishOnboardingRequest.ProtoReflect.Descriptor instead. func (*FinishOnboardingRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{449} + return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{451} } type FinishOnboardingResponse struct { @@ -29427,7 +29571,7 @@ type FinishOnboardingResponse struct { func (x *FinishOnboardingResponse) Reset() { *x = FinishOnboardingResponse{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[450] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[452] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29439,7 +29583,7 @@ func (x *FinishOnboardingResponse) String() string { func (*FinishOnboardingResponse) ProtoMessage() {} func (x *FinishOnboardingResponse) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[450] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[452] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29452,7 +29596,7 @@ func (x *FinishOnboardingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FinishOnboardingResponse.ProtoReflect.Descriptor instead. func (*FinishOnboardingResponse) Descriptor() ([]byte, []int) { - return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{450} + return file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP(), []int{452} } func (x *FinishOnboardingResponse) GetResponse() *Response { @@ -29486,7 +29630,7 @@ type Subgraph_PluginData struct { func (x *Subgraph_PluginData) Reset() { *x = Subgraph_PluginData{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[451] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[453] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29498,7 +29642,7 @@ func (x *Subgraph_PluginData) String() string { func (*Subgraph_PluginData) ProtoMessage() {} func (x *Subgraph_PluginData) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[451] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[453] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29539,7 +29683,7 @@ type GetSubgraphByNameResponse_LinkedSubgraph struct { func (x *GetSubgraphByNameResponse_LinkedSubgraph) Reset() { *x = GetSubgraphByNameResponse_LinkedSubgraph{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[452] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[454] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29551,7 +29695,7 @@ func (x *GetSubgraphByNameResponse_LinkedSubgraph) String() string { func (*GetSubgraphByNameResponse_LinkedSubgraph) ProtoMessage() {} func (x *GetSubgraphByNameResponse_LinkedSubgraph) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[452] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[454] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29599,7 +29743,7 @@ type SchemaCheck_GhDetails struct { func (x *SchemaCheck_GhDetails) Reset() { *x = SchemaCheck_GhDetails{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[453] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[455] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29611,7 +29755,7 @@ func (x *SchemaCheck_GhDetails) String() string { func (*SchemaCheck_GhDetails) ProtoMessage() {} func (x *SchemaCheck_GhDetails) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[453] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[455] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29664,7 +29808,7 @@ type SchemaCheck_CheckedSubgraph struct { func (x *SchemaCheck_CheckedSubgraph) Reset() { *x = SchemaCheck_CheckedSubgraph{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[454] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[456] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29676,7 +29820,7 @@ func (x *SchemaCheck_CheckedSubgraph) String() string { func (*SchemaCheck_CheckedSubgraph) ProtoMessage() {} func (x *SchemaCheck_CheckedSubgraph) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[454] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[456] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29752,7 +29896,7 @@ type SchemaCheck_LinkedCheck struct { func (x *SchemaCheck_LinkedCheck) Reset() { *x = SchemaCheck_LinkedCheck{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[455] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[457] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29764,7 +29908,7 @@ func (x *SchemaCheck_LinkedCheck) String() string { func (*SchemaCheck_LinkedCheck) ProtoMessage() {} func (x *SchemaCheck_LinkedCheck) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[455] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[457] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29867,7 +30011,7 @@ type GetCheckSummaryResponse_AffectedGraph struct { func (x *GetCheckSummaryResponse_AffectedGraph) Reset() { *x = GetCheckSummaryResponse_AffectedGraph{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[456] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[458] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29879,7 +30023,7 @@ func (x *GetCheckSummaryResponse_AffectedGraph) String() string { func (*GetCheckSummaryResponse_AffectedGraph) ProtoMessage() {} func (x *GetCheckSummaryResponse_AffectedGraph) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[456] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[458] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -29969,7 +30113,7 @@ type GetCheckSummaryResponse_ProposalSchemaMatch struct { func (x *GetCheckSummaryResponse_ProposalSchemaMatch) Reset() { *x = GetCheckSummaryResponse_ProposalSchemaMatch{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[457] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[459] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -29981,7 +30125,7 @@ func (x *GetCheckSummaryResponse_ProposalSchemaMatch) String() string { func (*GetCheckSummaryResponse_ProposalSchemaMatch) ProtoMessage() {} func (x *GetCheckSummaryResponse_ProposalSchemaMatch) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[457] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[459] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30034,7 +30178,7 @@ type GetCheckOperationsResponse_CheckOperation struct { func (x *GetCheckOperationsResponse_CheckOperation) Reset() { *x = GetCheckOperationsResponse_CheckOperation{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[458] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[460] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30046,7 +30190,7 @@ func (x *GetCheckOperationsResponse_CheckOperation) String() string { func (*GetCheckOperationsResponse_CheckOperation) ProtoMessage() {} func (x *GetCheckOperationsResponse_CheckOperation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[458] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[460] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30129,7 +30273,7 @@ type GetOrganizationGroupMembersResponse_GroupMember struct { func (x *GetOrganizationGroupMembersResponse_GroupMember) Reset() { *x = GetOrganizationGroupMembersResponse_GroupMember{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[460] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[462] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30141,7 +30285,7 @@ func (x *GetOrganizationGroupMembersResponse_GroupMember) String() string { func (*GetOrganizationGroupMembersResponse_GroupMember) ProtoMessage() {} func (x *GetOrganizationGroupMembersResponse_GroupMember) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[460] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[462] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30189,7 +30333,7 @@ type GetOrganizationGroupMembersResponse_GroupApiKey struct { func (x *GetOrganizationGroupMembersResponse_GroupApiKey) Reset() { *x = GetOrganizationGroupMembersResponse_GroupApiKey{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[461] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[463] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30201,7 +30345,7 @@ func (x *GetOrganizationGroupMembersResponse_GroupApiKey) String() string { func (*GetOrganizationGroupMembersResponse_GroupApiKey) ProtoMessage() {} func (x *GetOrganizationGroupMembersResponse_GroupApiKey) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[461] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[463] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30249,7 +30393,7 @@ type UpdateOrganizationGroupRequest_GroupRule struct { func (x *UpdateOrganizationGroupRequest_GroupRule) Reset() { *x = UpdateOrganizationGroupRequest_GroupRule{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[462] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[464] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30261,7 +30405,7 @@ func (x *UpdateOrganizationGroupRequest_GroupRule) String() string { func (*UpdateOrganizationGroupRequest_GroupRule) ProtoMessage() {} func (x *UpdateOrganizationGroupRequest_GroupRule) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[462] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[464] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30308,7 +30452,7 @@ type OrgMember_Group struct { func (x *OrgMember_Group) Reset() { *x = OrgMember_Group{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[463] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[465] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30320,7 +30464,7 @@ func (x *OrgMember_Group) String() string { func (*OrgMember_Group) ProtoMessage() {} func (x *OrgMember_Group) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[463] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[465] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30360,7 +30504,7 @@ type APIKey_Group struct { func (x *APIKey_Group) Reset() { *x = APIKey_Group{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[464] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[466] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30372,7 +30516,7 @@ func (x *APIKey_Group) String() string { func (*APIKey_Group) ProtoMessage() {} func (x *APIKey_Group) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[464] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[466] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30414,7 +30558,7 @@ type DeletePersistedOperationResponse_Operation struct { func (x *DeletePersistedOperationResponse_Operation) Reset() { *x = DeletePersistedOperationResponse_Operation{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[466] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[468] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30426,7 +30570,7 @@ func (x *DeletePersistedOperationResponse_Operation) String() string { func (*DeletePersistedOperationResponse_Operation) ProtoMessage() {} func (x *DeletePersistedOperationResponse_Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[466] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[468] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30483,7 +30627,7 @@ type CheckPersistedOperationTrafficResponse_Operation struct { func (x *CheckPersistedOperationTrafficResponse_Operation) Reset() { *x = CheckPersistedOperationTrafficResponse_Operation{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[467] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[469] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30495,7 +30639,7 @@ func (x *CheckPersistedOperationTrafficResponse_Operation) String() string { func (*CheckPersistedOperationTrafficResponse_Operation) ProtoMessage() {} func (x *CheckPersistedOperationTrafficResponse_Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[467] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[469] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30559,7 +30703,7 @@ type GetPersistedOperationsResponse_Operation struct { func (x *GetPersistedOperationsResponse_Operation) Reset() { *x = GetPersistedOperationsResponse_Operation{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[468] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[470] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30571,7 +30715,7 @@ func (x *GetPersistedOperationsResponse_Operation) String() string { func (*GetPersistedOperationsResponse_Operation) ProtoMessage() {} func (x *GetPersistedOperationsResponse_Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[468] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[470] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30633,7 +30777,7 @@ type GetOrganizationWebhookConfigsResponse_Config struct { func (x *GetOrganizationWebhookConfigsResponse_Config) Reset() { *x = GetOrganizationWebhookConfigsResponse_Config{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[469] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[471] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30645,7 +30789,7 @@ func (x *GetOrganizationWebhookConfigsResponse_Config) String() string { func (*GetOrganizationWebhookConfigsResponse_Config) ProtoMessage() {} func (x *GetOrganizationWebhookConfigsResponse_Config) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[469] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[471] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30693,7 +30837,7 @@ type GetBillingPlansResponse_BillingPlanFeature struct { func (x *GetBillingPlansResponse_BillingPlanFeature) Reset() { *x = GetBillingPlansResponse_BillingPlanFeature{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[470] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[472] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30705,7 +30849,7 @@ func (x *GetBillingPlansResponse_BillingPlanFeature) String() string { func (*GetBillingPlansResponse_BillingPlanFeature) ProtoMessage() {} func (x *GetBillingPlansResponse_BillingPlanFeature) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[470] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[472] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30754,7 +30898,7 @@ type GetBillingPlansResponse_BillingPlan struct { func (x *GetBillingPlansResponse_BillingPlan) Reset() { *x = GetBillingPlansResponse_BillingPlan{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[471] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[473] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30766,7 +30910,7 @@ func (x *GetBillingPlansResponse_BillingPlan) String() string { func (*GetBillingPlansResponse_BillingPlan) ProtoMessage() {} func (x *GetBillingPlansResponse_BillingPlan) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[471] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[473] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30823,7 +30967,7 @@ type GetAllOverridesResponse_Override struct { func (x *GetAllOverridesResponse_Override) Reset() { *x = GetAllOverridesResponse_Override{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[472] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[474] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30835,7 +30979,7 @@ func (x *GetAllOverridesResponse_Override) String() string { func (*GetAllOverridesResponse_Override) ProtoMessage() {} func (x *GetAllOverridesResponse_Override) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[472] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[474] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30896,7 +31040,7 @@ type GetUserAccessibleResourcesResponse_Namespace struct { func (x *GetUserAccessibleResourcesResponse_Namespace) Reset() { *x = GetUserAccessibleResourcesResponse_Namespace{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[473] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[475] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30908,7 +31052,7 @@ func (x *GetUserAccessibleResourcesResponse_Namespace) String() string { func (*GetUserAccessibleResourcesResponse_Namespace) ProtoMessage() {} func (x *GetUserAccessibleResourcesResponse_Namespace) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[473] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[475] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -30949,7 +31093,7 @@ type GetUserAccessibleResourcesResponse_FederatedGraph struct { func (x *GetUserAccessibleResourcesResponse_FederatedGraph) Reset() { *x = GetUserAccessibleResourcesResponse_FederatedGraph{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[474] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[476] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -30961,7 +31105,7 @@ func (x *GetUserAccessibleResourcesResponse_FederatedGraph) String() string { func (*GetUserAccessibleResourcesResponse_FederatedGraph) ProtoMessage() {} func (x *GetUserAccessibleResourcesResponse_FederatedGraph) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[474] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[476] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31010,7 +31154,7 @@ type GetUserAccessibleResourcesResponse_SubGraph struct { func (x *GetUserAccessibleResourcesResponse_SubGraph) Reset() { *x = GetUserAccessibleResourcesResponse_SubGraph{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[475] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[477] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31022,7 +31166,7 @@ func (x *GetUserAccessibleResourcesResponse_SubGraph) String() string { func (*GetUserAccessibleResourcesResponse_SubGraph) ProtoMessage() {} func (x *GetUserAccessibleResourcesResponse_SubGraph) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[475] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[477] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31077,7 +31221,7 @@ type ClientWithOperations_Operation struct { func (x *ClientWithOperations_Operation) Reset() { *x = ClientWithOperations_Operation{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[476] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[478] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31089,7 +31233,7 @@ func (x *ClientWithOperations_Operation) String() string { func (*ClientWithOperations_Operation) ProtoMessage() {} func (x *ClientWithOperations_Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[476] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[478] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31136,7 +31280,7 @@ type GetFeatureFlagByNameResponse_FfFederatedGraph struct { func (x *GetFeatureFlagByNameResponse_FfFederatedGraph) Reset() { *x = GetFeatureFlagByNameResponse_FfFederatedGraph{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[477] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[479] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31148,7 +31292,7 @@ func (x *GetFeatureFlagByNameResponse_FfFederatedGraph) String() string { func (*GetFeatureFlagByNameResponse_FfFederatedGraph) ProtoMessage() {} func (x *GetFeatureFlagByNameResponse_FfFederatedGraph) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[477] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[479] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31188,7 +31332,7 @@ type GetProposalResponse_CurrentSubgraph struct { func (x *GetProposalResponse_CurrentSubgraph) Reset() { *x = GetProposalResponse_CurrentSubgraph{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[478] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[480] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31200,7 +31344,7 @@ func (x *GetProposalResponse_CurrentSubgraph) String() string { func (*GetProposalResponse_CurrentSubgraph) ProtoMessage() {} func (x *GetProposalResponse_CurrentSubgraph) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[478] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[480] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31239,7 +31383,7 @@ type UpdateProposalRequest_UpdateProposalSubgraphs struct { func (x *UpdateProposalRequest_UpdateProposalSubgraphs) Reset() { *x = UpdateProposalRequest_UpdateProposalSubgraphs{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[479] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[481] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31251,7 +31395,7 @@ func (x *UpdateProposalRequest_UpdateProposalSubgraphs) String() string { func (*UpdateProposalRequest_UpdateProposalSubgraphs) ProtoMessage() {} func (x *UpdateProposalRequest_UpdateProposalSubgraphs) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[479] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[481] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31293,7 +31437,7 @@ type GetOperationsResponse_Operation struct { func (x *GetOperationsResponse_Operation) Reset() { *x = GetOperationsResponse_Operation{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[480] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[482] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31305,7 +31449,7 @@ func (x *GetOperationsResponse_Operation) String() string { func (*GetOperationsResponse_Operation) ProtoMessage() {} func (x *GetOperationsResponse_Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[480] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[482] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31421,7 +31565,7 @@ type GetClientsFromAnalyticsResponse_Client struct { func (x *GetClientsFromAnalyticsResponse_Client) Reset() { *x = GetClientsFromAnalyticsResponse_Client{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[481] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[483] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31433,7 +31577,7 @@ func (x *GetClientsFromAnalyticsResponse_Client) String() string { func (*GetClientsFromAnalyticsResponse_Client) ProtoMessage() {} func (x *GetClientsFromAnalyticsResponse_Client) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[481] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[483] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31468,7 +31612,7 @@ type GetOperationClientsResponse_Client struct { func (x *GetOperationClientsResponse_Client) Reset() { *x = GetOperationClientsResponse_Client{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[482] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[484] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31480,7 +31624,7 @@ func (x *GetOperationClientsResponse_Client) String() string { func (*GetOperationClientsResponse_Client) ProtoMessage() {} func (x *GetOperationClientsResponse_Client) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[482] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[484] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31536,7 +31680,7 @@ type GetOperationDeprecatedFieldsResponse_DeprecatedField struct { func (x *GetOperationDeprecatedFieldsResponse_DeprecatedField) Reset() { *x = GetOperationDeprecatedFieldsResponse_DeprecatedField{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[483] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[485] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31548,7 +31692,7 @@ func (x *GetOperationDeprecatedFieldsResponse_DeprecatedField) String() string { func (*GetOperationDeprecatedFieldsResponse_DeprecatedField) ProtoMessage() {} func (x *GetOperationDeprecatedFieldsResponse_DeprecatedField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[483] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[485] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -31604,7 +31748,7 @@ type ListOrganizationsResponse_OrganizationMembership struct { func (x *ListOrganizationsResponse_OrganizationMembership) Reset() { *x = ListOrganizationsResponse_OrganizationMembership{} - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[484] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[486] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -31616,7 +31760,7 @@ func (x *ListOrganizationsResponse_OrganizationMembership) String() string { func (*ListOrganizationsResponse_OrganizationMembership) ProtoMessage() {} func (x *ListOrganizationsResponse_OrganizationMembership) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[484] + mi := &file_wg_cosmo_platform_v1_platform_proto_msgTypes[486] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -34280,6 +34424,20 @@ const file_wg_cosmo_platform_v1_platform_proto_rawDesc = "" + "\x10deploymentErrors\x18\x03 \x03(\v2%.wg.cosmo.platform.v1.DeploymentErrorR\x10deploymentErrors\x12Z\n" + "\x13compositionWarnings\x18\x04 \x03(\v2(.wg.cosmo.platform.v1.CompositionWarningR\x13compositionWarnings\x12Q\n" + "\verrorCounts\x18\x05 \x01(\v2*.wg.cosmo.platform.v1.SubgraphPublishStatsH\x00R\verrorCounts\x88\x01\x01B\x0e\n" + + "\f_errorCounts\"\xe8\x01\n" + + "\x1bRecomposeFeatureFlagRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1c\n" + + "\tnamespace\x18\x02 \x01(\tR\tnamespace\x12\x19\n" + + "\x05limit\x18\x03 \x01(\x05H\x00R\x05limit\x88\x01\x01\x12M\n" + + " disable_resolvability_validation\x18\x05 \x01(\bH\x01R\x1edisableResolvabilityValidation\x88\x01\x01B\b\n" + + "\x06_limitB#\n" + + "!_disable_resolvability_validation\"\xc2\x03\n" + + "\x1cRecomposeFeatureFlagResponse\x12:\n" + + "\bresponse\x18\x01 \x01(\v2\x1e.wg.cosmo.platform.v1.ResponseR\bresponse\x12T\n" + + "\x11compositionErrors\x18\x02 \x03(\v2&.wg.cosmo.platform.v1.CompositionErrorR\x11compositionErrors\x12Q\n" + + "\x10deploymentErrors\x18\x03 \x03(\v2%.wg.cosmo.platform.v1.DeploymentErrorR\x10deploymentErrors\x12Z\n" + + "\x13compositionWarnings\x18\x04 \x03(\v2(.wg.cosmo.platform.v1.CompositionWarningR\x13compositionWarnings\x12Q\n" + + "\verrorCounts\x18\x05 \x01(\v2*.wg.cosmo.platform.v1.SubgraphPublishStatsH\x00R\verrorCounts\x88\x01\x01B\x0e\n" + "\f_errorCounts\"\x16\n" + "\x14GetOnboardingRequest\"\x81\x02\n" + "\x15GetOnboardingResponse\x12:\n" + @@ -34391,7 +34549,7 @@ const file_wg_cosmo_platform_v1_platform_proto_rawDesc = "" + "\x06ERRORS\x10\x02*\"\n" + "\rSortDirection\x12\a\n" + "\x03ASC\x10\x00\x12\b\n" + - "\x04DESC\x10\x012\u07bd\x01\n" + + "\x04DESC\x10\x012߾\x01\n" + "\x0fPlatformService\x12\x85\x01\n" + "\x16CreatePlaygroundScript\x123.wg.cosmo.platform.v1.CreatePlaygroundScriptRequest\x1a4.wg.cosmo.platform.v1.CreatePlaygroundScriptResponse\"\x00\x12\x85\x01\n" + "\x16DeletePlaygroundScript\x123.wg.cosmo.platform.v1.DeletePlaygroundScriptRequest\x1a4.wg.cosmo.platform.v1.DeletePlaygroundScriptResponse\"\x00\x12\x85\x01\n" + @@ -34578,7 +34736,8 @@ const file_wg_cosmo_platform_v1_platform_proto_rawDesc = "" + "\fLinkSubgraph\x12).wg.cosmo.platform.v1.LinkSubgraphRequest\x1a*.wg.cosmo.platform.v1.LinkSubgraphResponse\"\x00\x12m\n" + "\x0eUnlinkSubgraph\x12+.wg.cosmo.platform.v1.UnlinkSubgraphRequest\x1a,.wg.cosmo.platform.v1.UnlinkSubgraphResponse\"\x00\x12\x88\x01\n" + "\x17VerifyAPIKeyGraphAccess\x124.wg.cosmo.platform.v1.VerifyAPIKeyGraphAccessRequest\x1a5.wg.cosmo.platform.v1.VerifyAPIKeyGraphAccessResponse\"\x00\x12m\n" + - "\x0eRecomposeGraph\x12+.wg.cosmo.platform.v1.RecomposeGraphRequest\x1a,.wg.cosmo.platform.v1.RecomposeGraphResponse\"\x00\x12j\n" + + "\x0eRecomposeGraph\x12+.wg.cosmo.platform.v1.RecomposeGraphRequest\x1a,.wg.cosmo.platform.v1.RecomposeGraphResponse\"\x00\x12\x7f\n" + + "\x14RecomposeFeatureFlag\x121.wg.cosmo.platform.v1.RecomposeFeatureFlagRequest\x1a2.wg.cosmo.platform.v1.RecomposeFeatureFlagResponse\"\x00\x12j\n" + "\rGetOnboarding\x12*.wg.cosmo.platform.v1.GetOnboardingRequest\x1a+.wg.cosmo.platform.v1.GetOnboardingResponse\"\x00\x12s\n" + "\x10CreateOnboarding\x12-.wg.cosmo.platform.v1.CreateOnboardingRequest\x1a..wg.cosmo.platform.v1.CreateOnboardingResponse\"\x00\x12s\n" + "\x10FinishOnboarding\x12-.wg.cosmo.platform.v1.FinishOnboardingRequest\x1a..wg.cosmo.platform.v1.FinishOnboardingResponse\"\x00B\xef\x01\n" + @@ -34597,7 +34756,7 @@ func file_wg_cosmo_platform_v1_platform_proto_rawDescGZIP() []byte { } var file_wg_cosmo_platform_v1_platform_proto_enumTypes = make([]protoimpl.EnumInfo, 15) -var file_wg_cosmo_platform_v1_platform_proto_msgTypes = make([]protoimpl.MessageInfo, 485) +var file_wg_cosmo_platform_v1_platform_proto_msgTypes = make([]protoimpl.MessageInfo, 487) var file_wg_cosmo_platform_v1_platform_proto_goTypes = []any{ (LintSeverity)(0), // 0: wg.cosmo.platform.v1.LintSeverity (SubgraphType)(0), // 1: wg.cosmo.platform.v1.SubgraphType @@ -35059,60 +35218,62 @@ var file_wg_cosmo_platform_v1_platform_proto_goTypes = []any{ (*ListOrganizationsResponse)(nil), // 457: wg.cosmo.platform.v1.ListOrganizationsResponse (*RecomposeGraphRequest)(nil), // 458: wg.cosmo.platform.v1.RecomposeGraphRequest (*RecomposeGraphResponse)(nil), // 459: wg.cosmo.platform.v1.RecomposeGraphResponse - (*GetOnboardingRequest)(nil), // 460: wg.cosmo.platform.v1.GetOnboardingRequest - (*GetOnboardingResponse)(nil), // 461: wg.cosmo.platform.v1.GetOnboardingResponse - (*CreateOnboardingRequest)(nil), // 462: wg.cosmo.platform.v1.CreateOnboardingRequest - (*CreateOnboardingResponse)(nil), // 463: wg.cosmo.platform.v1.CreateOnboardingResponse - (*FinishOnboardingRequest)(nil), // 464: wg.cosmo.platform.v1.FinishOnboardingRequest - (*FinishOnboardingResponse)(nil), // 465: wg.cosmo.platform.v1.FinishOnboardingResponse - (*Subgraph_PluginData)(nil), // 466: wg.cosmo.platform.v1.Subgraph.PluginData - (*GetSubgraphByNameResponse_LinkedSubgraph)(nil), // 467: wg.cosmo.platform.v1.GetSubgraphByNameResponse.LinkedSubgraph - (*SchemaCheck_GhDetails)(nil), // 468: wg.cosmo.platform.v1.SchemaCheck.GhDetails - (*SchemaCheck_CheckedSubgraph)(nil), // 469: wg.cosmo.platform.v1.SchemaCheck.CheckedSubgraph - (*SchemaCheck_LinkedCheck)(nil), // 470: wg.cosmo.platform.v1.SchemaCheck.LinkedCheck - (*GetCheckSummaryResponse_AffectedGraph)(nil), // 471: wg.cosmo.platform.v1.GetCheckSummaryResponse.AffectedGraph - (*GetCheckSummaryResponse_ProposalSchemaMatch)(nil), // 472: wg.cosmo.platform.v1.GetCheckSummaryResponse.ProposalSchemaMatch - (*GetCheckOperationsResponse_CheckOperation)(nil), // 473: wg.cosmo.platform.v1.GetCheckOperationsResponse.CheckOperation - nil, // 474: wg.cosmo.platform.v1.AnalyticsViewRow.ValueEntry - (*GetOrganizationGroupMembersResponse_GroupMember)(nil), // 475: wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.GroupMember - (*GetOrganizationGroupMembersResponse_GroupApiKey)(nil), // 476: wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.GroupApiKey - (*UpdateOrganizationGroupRequest_GroupRule)(nil), // 477: wg.cosmo.platform.v1.UpdateOrganizationGroupRequest.GroupRule - (*OrgMember_Group)(nil), // 478: wg.cosmo.platform.v1.OrgMember.Group - (*APIKey_Group)(nil), // 479: wg.cosmo.platform.v1.APIKey.Group - nil, // 480: wg.cosmo.platform.v1.Span.AttributesEntry - (*DeletePersistedOperationResponse_Operation)(nil), // 481: wg.cosmo.platform.v1.DeletePersistedOperationResponse.Operation - (*CheckPersistedOperationTrafficResponse_Operation)(nil), // 482: wg.cosmo.platform.v1.CheckPersistedOperationTrafficResponse.Operation - (*GetPersistedOperationsResponse_Operation)(nil), // 483: wg.cosmo.platform.v1.GetPersistedOperationsResponse.Operation - (*GetOrganizationWebhookConfigsResponse_Config)(nil), // 484: wg.cosmo.platform.v1.GetOrganizationWebhookConfigsResponse.Config - (*GetBillingPlansResponse_BillingPlanFeature)(nil), // 485: wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlanFeature - (*GetBillingPlansResponse_BillingPlan)(nil), // 486: wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlan - (*GetAllOverridesResponse_Override)(nil), // 487: wg.cosmo.platform.v1.GetAllOverridesResponse.Override - (*GetUserAccessibleResourcesResponse_Namespace)(nil), // 488: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.Namespace - (*GetUserAccessibleResourcesResponse_FederatedGraph)(nil), // 489: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.FederatedGraph - (*GetUserAccessibleResourcesResponse_SubGraph)(nil), // 490: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.SubGraph - (*ClientWithOperations_Operation)(nil), // 491: wg.cosmo.platform.v1.ClientWithOperations.Operation - (*GetFeatureFlagByNameResponse_FfFederatedGraph)(nil), // 492: wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.FfFederatedGraph - (*GetProposalResponse_CurrentSubgraph)(nil), // 493: wg.cosmo.platform.v1.GetProposalResponse.CurrentSubgraph - (*UpdateProposalRequest_UpdateProposalSubgraphs)(nil), // 494: wg.cosmo.platform.v1.UpdateProposalRequest.UpdateProposalSubgraphs - (*GetOperationsResponse_Operation)(nil), // 495: wg.cosmo.platform.v1.GetOperationsResponse.Operation - (*GetClientsFromAnalyticsResponse_Client)(nil), // 496: wg.cosmo.platform.v1.GetClientsFromAnalyticsResponse.Client - (*GetOperationClientsResponse_Client)(nil), // 497: wg.cosmo.platform.v1.GetOperationClientsResponse.Client - (*GetOperationDeprecatedFieldsResponse_DeprecatedField)(nil), // 498: wg.cosmo.platform.v1.GetOperationDeprecatedFieldsResponse.DeprecatedField - (*ListOrganizationsResponse_OrganizationMembership)(nil), // 499: wg.cosmo.platform.v1.ListOrganizationsResponse.OrganizationMembership - (common.EnumStatusCode)(0), // 500: wg.cosmo.common.EnumStatusCode - (common.GraphQLSubscriptionProtocol)(0), // 501: wg.cosmo.common.GraphQLSubscriptionProtocol - (common.GraphQLWebsocketSubprotocol)(0), // 502: wg.cosmo.common.GraphQLWebsocketSubprotocol - (*notifications.EventMeta)(nil), // 503: wg.cosmo.notifications.EventMeta + (*RecomposeFeatureFlagRequest)(nil), // 460: wg.cosmo.platform.v1.RecomposeFeatureFlagRequest + (*RecomposeFeatureFlagResponse)(nil), // 461: wg.cosmo.platform.v1.RecomposeFeatureFlagResponse + (*GetOnboardingRequest)(nil), // 462: wg.cosmo.platform.v1.GetOnboardingRequest + (*GetOnboardingResponse)(nil), // 463: wg.cosmo.platform.v1.GetOnboardingResponse + (*CreateOnboardingRequest)(nil), // 464: wg.cosmo.platform.v1.CreateOnboardingRequest + (*CreateOnboardingResponse)(nil), // 465: wg.cosmo.platform.v1.CreateOnboardingResponse + (*FinishOnboardingRequest)(nil), // 466: wg.cosmo.platform.v1.FinishOnboardingRequest + (*FinishOnboardingResponse)(nil), // 467: wg.cosmo.platform.v1.FinishOnboardingResponse + (*Subgraph_PluginData)(nil), // 468: wg.cosmo.platform.v1.Subgraph.PluginData + (*GetSubgraphByNameResponse_LinkedSubgraph)(nil), // 469: wg.cosmo.platform.v1.GetSubgraphByNameResponse.LinkedSubgraph + (*SchemaCheck_GhDetails)(nil), // 470: wg.cosmo.platform.v1.SchemaCheck.GhDetails + (*SchemaCheck_CheckedSubgraph)(nil), // 471: wg.cosmo.platform.v1.SchemaCheck.CheckedSubgraph + (*SchemaCheck_LinkedCheck)(nil), // 472: wg.cosmo.platform.v1.SchemaCheck.LinkedCheck + (*GetCheckSummaryResponse_AffectedGraph)(nil), // 473: wg.cosmo.platform.v1.GetCheckSummaryResponse.AffectedGraph + (*GetCheckSummaryResponse_ProposalSchemaMatch)(nil), // 474: wg.cosmo.platform.v1.GetCheckSummaryResponse.ProposalSchemaMatch + (*GetCheckOperationsResponse_CheckOperation)(nil), // 475: wg.cosmo.platform.v1.GetCheckOperationsResponse.CheckOperation + nil, // 476: wg.cosmo.platform.v1.AnalyticsViewRow.ValueEntry + (*GetOrganizationGroupMembersResponse_GroupMember)(nil), // 477: wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.GroupMember + (*GetOrganizationGroupMembersResponse_GroupApiKey)(nil), // 478: wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.GroupApiKey + (*UpdateOrganizationGroupRequest_GroupRule)(nil), // 479: wg.cosmo.platform.v1.UpdateOrganizationGroupRequest.GroupRule + (*OrgMember_Group)(nil), // 480: wg.cosmo.platform.v1.OrgMember.Group + (*APIKey_Group)(nil), // 481: wg.cosmo.platform.v1.APIKey.Group + nil, // 482: wg.cosmo.platform.v1.Span.AttributesEntry + (*DeletePersistedOperationResponse_Operation)(nil), // 483: wg.cosmo.platform.v1.DeletePersistedOperationResponse.Operation + (*CheckPersistedOperationTrafficResponse_Operation)(nil), // 484: wg.cosmo.platform.v1.CheckPersistedOperationTrafficResponse.Operation + (*GetPersistedOperationsResponse_Operation)(nil), // 485: wg.cosmo.platform.v1.GetPersistedOperationsResponse.Operation + (*GetOrganizationWebhookConfigsResponse_Config)(nil), // 486: wg.cosmo.platform.v1.GetOrganizationWebhookConfigsResponse.Config + (*GetBillingPlansResponse_BillingPlanFeature)(nil), // 487: wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlanFeature + (*GetBillingPlansResponse_BillingPlan)(nil), // 488: wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlan + (*GetAllOverridesResponse_Override)(nil), // 489: wg.cosmo.platform.v1.GetAllOverridesResponse.Override + (*GetUserAccessibleResourcesResponse_Namespace)(nil), // 490: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.Namespace + (*GetUserAccessibleResourcesResponse_FederatedGraph)(nil), // 491: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.FederatedGraph + (*GetUserAccessibleResourcesResponse_SubGraph)(nil), // 492: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.SubGraph + (*ClientWithOperations_Operation)(nil), // 493: wg.cosmo.platform.v1.ClientWithOperations.Operation + (*GetFeatureFlagByNameResponse_FfFederatedGraph)(nil), // 494: wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.FfFederatedGraph + (*GetProposalResponse_CurrentSubgraph)(nil), // 495: wg.cosmo.platform.v1.GetProposalResponse.CurrentSubgraph + (*UpdateProposalRequest_UpdateProposalSubgraphs)(nil), // 496: wg.cosmo.platform.v1.UpdateProposalRequest.UpdateProposalSubgraphs + (*GetOperationsResponse_Operation)(nil), // 497: wg.cosmo.platform.v1.GetOperationsResponse.Operation + (*GetClientsFromAnalyticsResponse_Client)(nil), // 498: wg.cosmo.platform.v1.GetClientsFromAnalyticsResponse.Client + (*GetOperationClientsResponse_Client)(nil), // 499: wg.cosmo.platform.v1.GetOperationClientsResponse.Client + (*GetOperationDeprecatedFieldsResponse_DeprecatedField)(nil), // 500: wg.cosmo.platform.v1.GetOperationDeprecatedFieldsResponse.DeprecatedField + (*ListOrganizationsResponse_OrganizationMembership)(nil), // 501: wg.cosmo.platform.v1.ListOrganizationsResponse.OrganizationMembership + (common.EnumStatusCode)(0), // 502: wg.cosmo.common.EnumStatusCode + (common.GraphQLSubscriptionProtocol)(0), // 503: wg.cosmo.common.GraphQLSubscriptionProtocol + (common.GraphQLWebsocketSubprotocol)(0), // 504: wg.cosmo.common.GraphQLWebsocketSubprotocol + (*notifications.EventMeta)(nil), // 505: wg.cosmo.notifications.EventMeta } var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ - 500, // 0: wg.cosmo.platform.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode + 502, // 0: wg.cosmo.platform.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode 16, // 1: wg.cosmo.platform.v1.PublishMonographResponse.response:type_name -> wg.cosmo.platform.v1.Response 38, // 2: wg.cosmo.platform.v1.PublishMonographResponse.compositionErrors:type_name -> wg.cosmo.platform.v1.CompositionError 40, // 3: wg.cosmo.platform.v1.PublishMonographResponse.deploymentErrors:type_name -> wg.cosmo.platform.v1.DeploymentError 39, // 4: wg.cosmo.platform.v1.PublishMonographResponse.compositionWarnings:type_name -> wg.cosmo.platform.v1.CompositionWarning 15, // 5: wg.cosmo.platform.v1.PublishFederatedSubgraphRequest.labels:type_name -> wg.cosmo.platform.v1.Label - 501, // 6: wg.cosmo.platform.v1.PublishFederatedSubgraphRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 502, // 7: wg.cosmo.platform.v1.PublishFederatedSubgraphRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 503, // 6: wg.cosmo.platform.v1.PublishFederatedSubgraphRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 504, // 7: wg.cosmo.platform.v1.PublishFederatedSubgraphRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol 1, // 8: wg.cosmo.platform.v1.PublishFederatedSubgraphRequest.type:type_name -> wg.cosmo.platform.v1.SubgraphType 20, // 9: wg.cosmo.platform.v1.PublishFederatedSubgraphRequest.proto:type_name -> wg.cosmo.platform.v1.ProtoInput 16, // 10: wg.cosmo.platform.v1.PublishFederatedSubgraphResponse.response:type_name -> wg.cosmo.platform.v1.Response @@ -35123,12 +35284,12 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 24, // 15: wg.cosmo.platform.v1.CheckSubgraphSchemaRequest.gitInfo:type_name -> wg.cosmo.platform.v1.GitInfo 25, // 16: wg.cosmo.platform.v1.CheckSubgraphSchemaRequest.vcsContext:type_name -> wg.cosmo.platform.v1.VCSContext 15, // 17: wg.cosmo.platform.v1.CheckSubgraphSchemaRequest.labels:type_name -> wg.cosmo.platform.v1.Label - 501, // 18: wg.cosmo.platform.v1.CreateMonographRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 502, // 19: wg.cosmo.platform.v1.CreateMonographRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 503, // 18: wg.cosmo.platform.v1.CreateMonographRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 504, // 19: wg.cosmo.platform.v1.CreateMonographRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol 16, // 20: wg.cosmo.platform.v1.CreateMonographResponse.response:type_name -> wg.cosmo.platform.v1.Response 15, // 21: wg.cosmo.platform.v1.CreateFederatedSubgraphRequest.labels:type_name -> wg.cosmo.platform.v1.Label - 501, // 22: wg.cosmo.platform.v1.CreateFederatedSubgraphRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 502, // 23: wg.cosmo.platform.v1.CreateFederatedSubgraphRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 503, // 22: wg.cosmo.platform.v1.CreateFederatedSubgraphRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 504, // 23: wg.cosmo.platform.v1.CreateFederatedSubgraphRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol 1, // 24: wg.cosmo.platform.v1.CreateFederatedSubgraphRequest.type:type_name -> wg.cosmo.platform.v1.SubgraphType 16, // 25: wg.cosmo.platform.v1.DeleteMonographResponse.response:type_name -> wg.cosmo.platform.v1.Response 0, // 26: wg.cosmo.platform.v1.LintIssue.severity:type_name -> wg.cosmo.platform.v1.LintSeverity @@ -35167,7 +35328,7 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 55, // 59: wg.cosmo.platform.v1.GetFederatedGraphsBySubgraphLabelsResponse.graphs:type_name -> wg.cosmo.platform.v1.FederatedGraph 15, // 60: wg.cosmo.platform.v1.Subgraph.labels:type_name -> wg.cosmo.platform.v1.Label 1, // 61: wg.cosmo.platform.v1.Subgraph.type:type_name -> wg.cosmo.platform.v1.SubgraphType - 466, // 62: wg.cosmo.platform.v1.Subgraph.pluginData:type_name -> wg.cosmo.platform.v1.Subgraph.PluginData + 468, // 62: wg.cosmo.platform.v1.Subgraph.pluginData:type_name -> wg.cosmo.platform.v1.Subgraph.PluginData 16, // 63: wg.cosmo.platform.v1.GetSubgraphsResponse.response:type_name -> wg.cosmo.platform.v1.Response 60, // 64: wg.cosmo.platform.v1.GetSubgraphsResponse.graphs:type_name -> wg.cosmo.platform.v1.Subgraph 16, // 65: wg.cosmo.platform.v1.GetFederatedGraphByNameResponse.response:type_name -> wg.cosmo.platform.v1.Response @@ -35177,26 +35338,26 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 69: wg.cosmo.platform.v1.GetSubgraphByNameResponse.response:type_name -> wg.cosmo.platform.v1.Response 60, // 70: wg.cosmo.platform.v1.GetSubgraphByNameResponse.graph:type_name -> wg.cosmo.platform.v1.Subgraph 291, // 71: wg.cosmo.platform.v1.GetSubgraphByNameResponse.members:type_name -> wg.cosmo.platform.v1.SubgraphMember - 467, // 72: wg.cosmo.platform.v1.GetSubgraphByNameResponse.linkedSubgraph:type_name -> wg.cosmo.platform.v1.GetSubgraphByNameResponse.LinkedSubgraph + 469, // 72: wg.cosmo.platform.v1.GetSubgraphByNameResponse.linkedSubgraph:type_name -> wg.cosmo.platform.v1.GetSubgraphByNameResponse.LinkedSubgraph 16, // 73: wg.cosmo.platform.v1.GetSubgraphSDLFromLatestCompositionResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 74: wg.cosmo.platform.v1.GetLatestSubgraphSDLResponse.response:type_name -> wg.cosmo.platform.v1.Response 72, // 75: wg.cosmo.platform.v1.GetChecksByFederatedGraphNameRequest.filters:type_name -> wg.cosmo.platform.v1.GetChecksByFederatedGraphNameFilters - 468, // 76: wg.cosmo.platform.v1.SchemaCheck.ghDetails:type_name -> wg.cosmo.platform.v1.SchemaCheck.GhDetails + 470, // 76: wg.cosmo.platform.v1.SchemaCheck.ghDetails:type_name -> wg.cosmo.platform.v1.SchemaCheck.GhDetails 25, // 77: wg.cosmo.platform.v1.SchemaCheck.vcsContext:type_name -> wg.cosmo.platform.v1.VCSContext - 469, // 78: wg.cosmo.platform.v1.SchemaCheck.checkedSubgraphs:type_name -> wg.cosmo.platform.v1.SchemaCheck.CheckedSubgraph - 470, // 79: wg.cosmo.platform.v1.SchemaCheck.linkedChecks:type_name -> wg.cosmo.platform.v1.SchemaCheck.LinkedCheck + 471, // 78: wg.cosmo.platform.v1.SchemaCheck.checkedSubgraphs:type_name -> wg.cosmo.platform.v1.SchemaCheck.CheckedSubgraph + 472, // 79: wg.cosmo.platform.v1.SchemaCheck.linkedChecks:type_name -> wg.cosmo.platform.v1.SchemaCheck.LinkedCheck 16, // 80: wg.cosmo.platform.v1.GetChecksByFederatedGraphNameResponse.response:type_name -> wg.cosmo.platform.v1.Response 74, // 81: wg.cosmo.platform.v1.GetChecksByFederatedGraphNameResponse.checks:type_name -> wg.cosmo.platform.v1.SchemaCheck 16, // 82: wg.cosmo.platform.v1.GetCheckSummaryResponse.response:type_name -> wg.cosmo.platform.v1.Response 74, // 83: wg.cosmo.platform.v1.GetCheckSummaryResponse.check:type_name -> wg.cosmo.platform.v1.SchemaCheck - 471, // 84: wg.cosmo.platform.v1.GetCheckSummaryResponse.affected_graphs:type_name -> wg.cosmo.platform.v1.GetCheckSummaryResponse.AffectedGraph + 473, // 84: wg.cosmo.platform.v1.GetCheckSummaryResponse.affected_graphs:type_name -> wg.cosmo.platform.v1.GetCheckSummaryResponse.AffectedGraph 36, // 85: wg.cosmo.platform.v1.GetCheckSummaryResponse.changes:type_name -> wg.cosmo.platform.v1.SchemaChange 44, // 86: wg.cosmo.platform.v1.GetCheckSummaryResponse.lintIssues:type_name -> wg.cosmo.platform.v1.LintIssue 45, // 87: wg.cosmo.platform.v1.GetCheckSummaryResponse.graphPruningIssues:type_name -> wg.cosmo.platform.v1.GraphPruningIssue - 472, // 88: wg.cosmo.platform.v1.GetCheckSummaryResponse.proposalMatches:type_name -> wg.cosmo.platform.v1.GetCheckSummaryResponse.ProposalSchemaMatch + 474, // 88: wg.cosmo.platform.v1.GetCheckSummaryResponse.proposalMatches:type_name -> wg.cosmo.platform.v1.GetCheckSummaryResponse.ProposalSchemaMatch 37, // 89: wg.cosmo.platform.v1.GetCheckSummaryResponse.composedSchemaBreakingChanges:type_name -> wg.cosmo.platform.v1.FederatedGraphSchemaChange 16, // 90: wg.cosmo.platform.v1.GetCheckOperationsResponse.response:type_name -> wg.cosmo.platform.v1.Response - 473, // 91: wg.cosmo.platform.v1.GetCheckOperationsResponse.operations:type_name -> wg.cosmo.platform.v1.GetCheckOperationsResponse.CheckOperation + 475, // 91: wg.cosmo.platform.v1.GetCheckOperationsResponse.operations:type_name -> wg.cosmo.platform.v1.GetCheckOperationsResponse.CheckOperation 16, // 92: wg.cosmo.platform.v1.GetOperationContentResponse.response:type_name -> wg.cosmo.platform.v1.Response 96, // 93: wg.cosmo.platform.v1.GetFederatedGraphChangelogRequest.pagination:type_name -> wg.cosmo.platform.v1.Pagination 100, // 94: wg.cosmo.platform.v1.GetFederatedGraphChangelogRequest.dateRange:type_name -> wg.cosmo.platform.v1.DateRange @@ -35205,8 +35366,8 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 85, // 97: wg.cosmo.platform.v1.GetFederatedGraphChangelogResponse.federatedGraphChangelogOutput:type_name -> wg.cosmo.platform.v1.FederatedGraphChangelogOutput 16, // 98: wg.cosmo.platform.v1.GetFederatedResponse.response:type_name -> wg.cosmo.platform.v1.Response 15, // 99: wg.cosmo.platform.v1.UpdateSubgraphRequest.labels:type_name -> wg.cosmo.platform.v1.Label - 501, // 100: wg.cosmo.platform.v1.UpdateSubgraphRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 502, // 101: wg.cosmo.platform.v1.UpdateSubgraphRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 503, // 100: wg.cosmo.platform.v1.UpdateSubgraphRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 504, // 101: wg.cosmo.platform.v1.UpdateSubgraphRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol 16, // 102: wg.cosmo.platform.v1.UpdateSubgraphResponse.response:type_name -> wg.cosmo.platform.v1.Response 38, // 103: wg.cosmo.platform.v1.UpdateSubgraphResponse.compositionErrors:type_name -> wg.cosmo.platform.v1.CompositionError 40, // 104: wg.cosmo.platform.v1.UpdateSubgraphResponse.deploymentErrors:type_name -> wg.cosmo.platform.v1.DeploymentError @@ -35215,8 +35376,8 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 38, // 107: wg.cosmo.platform.v1.UpdateFederatedGraphResponse.compositionErrors:type_name -> wg.cosmo.platform.v1.CompositionError 40, // 108: wg.cosmo.platform.v1.UpdateFederatedGraphResponse.deploymentErrors:type_name -> wg.cosmo.platform.v1.DeploymentError 39, // 109: wg.cosmo.platform.v1.UpdateFederatedGraphResponse.compositionWarnings:type_name -> wg.cosmo.platform.v1.CompositionWarning - 501, // 110: wg.cosmo.platform.v1.UpdateMonographRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 502, // 111: wg.cosmo.platform.v1.UpdateMonographRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 503, // 110: wg.cosmo.platform.v1.UpdateMonographRequest.subscription_protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 504, // 111: wg.cosmo.platform.v1.UpdateMonographRequest.websocket_subprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol 16, // 112: wg.cosmo.platform.v1.UpdateMonographResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 113: wg.cosmo.platform.v1.CheckFederatedGraphResponse.response:type_name -> wg.cosmo.platform.v1.Response 38, // 114: wg.cosmo.platform.v1.CheckFederatedGraphResponse.compositionErrors:type_name -> wg.cosmo.platform.v1.CompositionError @@ -35237,7 +35398,7 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 105, // 129: wg.cosmo.platform.v1.AnalyticsViewResultFilter.options:type_name -> wg.cosmo.platform.v1.AnalyticsViewResultFilterOption 3, // 130: wg.cosmo.platform.v1.AnalyticsViewResultFilter.custom_options:type_name -> wg.cosmo.platform.v1.CustomOptions 5, // 131: wg.cosmo.platform.v1.AnalyticsViewResultFilterOption.operator:type_name -> wg.cosmo.platform.v1.AnalyticsViewFilterOperator - 474, // 132: wg.cosmo.platform.v1.AnalyticsViewRow.value:type_name -> wg.cosmo.platform.v1.AnalyticsViewRow.ValueEntry + 476, // 132: wg.cosmo.platform.v1.AnalyticsViewRow.value:type_name -> wg.cosmo.platform.v1.AnalyticsViewRow.ValueEntry 16, // 133: wg.cosmo.platform.v1.GetAnalyticsViewResponse.response:type_name -> wg.cosmo.platform.v1.Response 102, // 134: wg.cosmo.platform.v1.GetAnalyticsViewResponse.view:type_name -> wg.cosmo.platform.v1.AnalyticsViewResult 16, // 135: wg.cosmo.platform.v1.GetDashboardAnalyticsViewResponse.response:type_name -> wg.cosmo.platform.v1.Response @@ -35252,12 +35413,12 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 144: wg.cosmo.platform.v1.GetOrganizationGroupsResponse.response:type_name -> wg.cosmo.platform.v1.Response 118, // 145: wg.cosmo.platform.v1.GetOrganizationGroupsResponse.groups:type_name -> wg.cosmo.platform.v1.OrganizationGroup 16, // 146: wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.response:type_name -> wg.cosmo.platform.v1.Response - 475, // 147: wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.members:type_name -> wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.GroupMember - 476, // 148: wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.apiKeys:type_name -> wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.GroupApiKey - 477, // 149: wg.cosmo.platform.v1.UpdateOrganizationGroupRequest.rules:type_name -> wg.cosmo.platform.v1.UpdateOrganizationGroupRequest.GroupRule + 477, // 147: wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.members:type_name -> wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.GroupMember + 478, // 148: wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.apiKeys:type_name -> wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse.GroupApiKey + 479, // 149: wg.cosmo.platform.v1.UpdateOrganizationGroupRequest.rules:type_name -> wg.cosmo.platform.v1.UpdateOrganizationGroupRequest.GroupRule 16, // 150: wg.cosmo.platform.v1.UpdateOrganizationGroupResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 151: wg.cosmo.platform.v1.DeleteOrganizationGroupResponse.response:type_name -> wg.cosmo.platform.v1.Response - 478, // 152: wg.cosmo.platform.v1.OrgMember.groups:type_name -> wg.cosmo.platform.v1.OrgMember.Group + 480, // 152: wg.cosmo.platform.v1.OrgMember.groups:type_name -> wg.cosmo.platform.v1.OrgMember.Group 96, // 153: wg.cosmo.platform.v1.GetPendingOrganizationMembersRequest.pagination:type_name -> wg.cosmo.platform.v1.Pagination 16, // 154: wg.cosmo.platform.v1.GetPendingOrganizationMembersResponse.response:type_name -> wg.cosmo.platform.v1.Response 130, // 155: wg.cosmo.platform.v1.GetPendingOrganizationMembersResponse.pendingInvitations:type_name -> wg.cosmo.platform.v1.PendingOrgInvitation @@ -35267,7 +35428,7 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 159: wg.cosmo.platform.v1.InviteUserResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 160: wg.cosmo.platform.v1.InviteUsersResponse.response:type_name -> wg.cosmo.platform.v1.Response 138, // 161: wg.cosmo.platform.v1.InviteUsersResponse.invitationErrors:type_name -> wg.cosmo.platform.v1.InviteUsersInvitationError - 479, // 162: wg.cosmo.platform.v1.APIKey.group:type_name -> wg.cosmo.platform.v1.APIKey.Group + 481, // 162: wg.cosmo.platform.v1.APIKey.group:type_name -> wg.cosmo.platform.v1.APIKey.Group 16, // 163: wg.cosmo.platform.v1.GetAPIKeysResponse.response:type_name -> wg.cosmo.platform.v1.Response 140, // 164: wg.cosmo.platform.v1.GetAPIKeysResponse.apiKeys:type_name -> wg.cosmo.platform.v1.APIKey 6, // 165: wg.cosmo.platform.v1.CreateAPIKeyRequest.expires:type_name -> wg.cosmo.platform.v1.ExpiresAt @@ -35277,7 +35438,7 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 169: wg.cosmo.platform.v1.RemoveOrganizationMemberResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 170: wg.cosmo.platform.v1.RemoveInvitationResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 171: wg.cosmo.platform.v1.MigrateFromApolloResponse.response:type_name -> wg.cosmo.platform.v1.Response - 480, // 172: wg.cosmo.platform.v1.Span.attributes:type_name -> wg.cosmo.platform.v1.Span.AttributesEntry + 482, // 172: wg.cosmo.platform.v1.Span.attributes:type_name -> wg.cosmo.platform.v1.Span.AttributesEntry 16, // 173: wg.cosmo.platform.v1.GetTraceResponse.response:type_name -> wg.cosmo.platform.v1.Response 155, // 174: wg.cosmo.platform.v1.GetTraceResponse.spans:type_name -> wg.cosmo.platform.v1.Span 16, // 175: wg.cosmo.platform.v1.WhoAmIResponse.response:type_name -> wg.cosmo.platform.v1.Response @@ -35290,29 +35451,29 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 182: wg.cosmo.platform.v1.PublishPersistedOperationsResponse.response:type_name -> wg.cosmo.platform.v1.Response 169, // 183: wg.cosmo.platform.v1.PublishPersistedOperationsResponse.operations:type_name -> wg.cosmo.platform.v1.PublishedOperation 16, // 184: wg.cosmo.platform.v1.DeletePersistedOperationResponse.response:type_name -> wg.cosmo.platform.v1.Response - 481, // 185: wg.cosmo.platform.v1.DeletePersistedOperationResponse.operation:type_name -> wg.cosmo.platform.v1.DeletePersistedOperationResponse.Operation + 483, // 185: wg.cosmo.platform.v1.DeletePersistedOperationResponse.operation:type_name -> wg.cosmo.platform.v1.DeletePersistedOperationResponse.Operation 16, // 186: wg.cosmo.platform.v1.CheckPersistedOperationTrafficResponse.response:type_name -> wg.cosmo.platform.v1.Response - 482, // 187: wg.cosmo.platform.v1.CheckPersistedOperationTrafficResponse.operation:type_name -> wg.cosmo.platform.v1.CheckPersistedOperationTrafficResponse.Operation + 484, // 187: wg.cosmo.platform.v1.CheckPersistedOperationTrafficResponse.operation:type_name -> wg.cosmo.platform.v1.CheckPersistedOperationTrafficResponse.Operation 16, // 188: wg.cosmo.platform.v1.GetPersistedOperationsResponse.response:type_name -> wg.cosmo.platform.v1.Response - 483, // 189: wg.cosmo.platform.v1.GetPersistedOperationsResponse.operations:type_name -> wg.cosmo.platform.v1.GetPersistedOperationsResponse.Operation - 503, // 190: wg.cosmo.platform.v1.CreateOrganizationWebhookConfigRequest.events_meta:type_name -> wg.cosmo.notifications.EventMeta + 485, // 189: wg.cosmo.platform.v1.GetPersistedOperationsResponse.operations:type_name -> wg.cosmo.platform.v1.GetPersistedOperationsResponse.Operation + 505, // 190: wg.cosmo.platform.v1.CreateOrganizationWebhookConfigRequest.events_meta:type_name -> wg.cosmo.notifications.EventMeta 16, // 191: wg.cosmo.platform.v1.CreateOrganizationWebhookConfigResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 192: wg.cosmo.platform.v1.GetOrganizationWebhookConfigsResponse.response:type_name -> wg.cosmo.platform.v1.Response - 484, // 193: wg.cosmo.platform.v1.GetOrganizationWebhookConfigsResponse.configs:type_name -> wg.cosmo.platform.v1.GetOrganizationWebhookConfigsResponse.Config + 486, // 193: wg.cosmo.platform.v1.GetOrganizationWebhookConfigsResponse.configs:type_name -> wg.cosmo.platform.v1.GetOrganizationWebhookConfigsResponse.Config 16, // 194: wg.cosmo.platform.v1.GetOrganizationWebhookMetaResponse.response:type_name -> wg.cosmo.platform.v1.Response - 503, // 195: wg.cosmo.platform.v1.GetOrganizationWebhookMetaResponse.events_meta:type_name -> wg.cosmo.notifications.EventMeta - 503, // 196: wg.cosmo.platform.v1.UpdateOrganizationWebhookConfigRequest.events_meta:type_name -> wg.cosmo.notifications.EventMeta + 505, // 195: wg.cosmo.platform.v1.GetOrganizationWebhookMetaResponse.events_meta:type_name -> wg.cosmo.notifications.EventMeta + 505, // 196: wg.cosmo.platform.v1.UpdateOrganizationWebhookConfigRequest.events_meta:type_name -> wg.cosmo.notifications.EventMeta 16, // 197: wg.cosmo.platform.v1.UpdateOrganizationWebhookConfigResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 198: wg.cosmo.platform.v1.DeleteOrganizationWebhookConfigResponse.response:type_name -> wg.cosmo.platform.v1.Response - 503, // 199: wg.cosmo.platform.v1.CreateIntegrationRequest.eventsMeta:type_name -> wg.cosmo.notifications.EventMeta + 505, // 199: wg.cosmo.platform.v1.CreateIntegrationRequest.eventsMeta:type_name -> wg.cosmo.notifications.EventMeta 16, // 200: wg.cosmo.platform.v1.CreateIntegrationResponse.response:type_name -> wg.cosmo.platform.v1.Response 8, // 201: wg.cosmo.platform.v1.IntegrationConfig.type:type_name -> wg.cosmo.platform.v1.IntegrationType 191, // 202: wg.cosmo.platform.v1.IntegrationConfig.slackIntegrationConfig:type_name -> wg.cosmo.platform.v1.SlackIntegrationConfig 192, // 203: wg.cosmo.platform.v1.Integration.integrationConfig:type_name -> wg.cosmo.platform.v1.IntegrationConfig - 503, // 204: wg.cosmo.platform.v1.Integration.eventsMeta:type_name -> wg.cosmo.notifications.EventMeta + 505, // 204: wg.cosmo.platform.v1.Integration.eventsMeta:type_name -> wg.cosmo.notifications.EventMeta 16, // 205: wg.cosmo.platform.v1.GetOrganizationIntegrationsResponse.response:type_name -> wg.cosmo.platform.v1.Response 193, // 206: wg.cosmo.platform.v1.GetOrganizationIntegrationsResponse.integrations:type_name -> wg.cosmo.platform.v1.Integration - 503, // 207: wg.cosmo.platform.v1.UpdateIntegrationConfigRequest.events_meta:type_name -> wg.cosmo.notifications.EventMeta + 505, // 207: wg.cosmo.platform.v1.UpdateIntegrationConfigRequest.events_meta:type_name -> wg.cosmo.notifications.EventMeta 16, // 208: wg.cosmo.platform.v1.UpdateIntegrationConfigResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 209: wg.cosmo.platform.v1.DeleteIntegrationResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 210: wg.cosmo.platform.v1.DeleteOrganizationResponse.response:type_name -> wg.cosmo.platform.v1.Response @@ -35325,7 +35486,7 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 217: wg.cosmo.platform.v1.GetOrganizationBySlugResponse.response:type_name -> wg.cosmo.platform.v1.Response 211, // 218: wg.cosmo.platform.v1.GetOrganizationBySlugResponse.organization:type_name -> wg.cosmo.platform.v1.Organization 16, // 219: wg.cosmo.platform.v1.GetBillingPlansResponse.response:type_name -> wg.cosmo.platform.v1.Response - 486, // 220: wg.cosmo.platform.v1.GetBillingPlansResponse.plans:type_name -> wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlan + 488, // 220: wg.cosmo.platform.v1.GetBillingPlansResponse.plans:type_name -> wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlan 16, // 221: wg.cosmo.platform.v1.CreateCheckoutSessionResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 222: wg.cosmo.platform.v1.CreateBillingPortalSessionResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 223: wg.cosmo.platform.v1.UpgradePlanResponse.response:type_name -> wg.cosmo.platform.v1.Response @@ -35366,7 +35527,7 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 258: wg.cosmo.platform.v1.GetOperationOverridesResponse.response:type_name -> wg.cosmo.platform.v1.Response 241, // 259: wg.cosmo.platform.v1.GetOperationOverridesResponse.changes:type_name -> wg.cosmo.platform.v1.OverrideChange 16, // 260: wg.cosmo.platform.v1.GetAllOverridesResponse.response:type_name -> wg.cosmo.platform.v1.Response - 487, // 261: wg.cosmo.platform.v1.GetAllOverridesResponse.overrides:type_name -> wg.cosmo.platform.v1.GetAllOverridesResponse.Override + 489, // 261: wg.cosmo.platform.v1.GetAllOverridesResponse.overrides:type_name -> wg.cosmo.platform.v1.GetAllOverridesResponse.Override 24, // 262: wg.cosmo.platform.v1.IsGitHubAppInstalledRequest.git_info:type_name -> wg.cosmo.platform.v1.GitInfo 16, // 263: wg.cosmo.platform.v1.IsGitHubAppInstalledResponse.response:type_name -> wg.cosmo.platform.v1.Response 256, // 264: wg.cosmo.platform.v1.CreateOIDCProviderRequest.mappers:type_name -> wg.cosmo.platform.v1.GroupMapper @@ -35394,9 +35555,9 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 286: wg.cosmo.platform.v1.GetChangelogBySchemaVersionResponse.response:type_name -> wg.cosmo.platform.v1.Response 85, // 287: wg.cosmo.platform.v1.GetChangelogBySchemaVersionResponse.changelog:type_name -> wg.cosmo.platform.v1.FederatedGraphChangelogOutput 16, // 288: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.response:type_name -> wg.cosmo.platform.v1.Response - 488, // 289: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.namespaces:type_name -> wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.Namespace - 489, // 290: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.federatedGraphs:type_name -> wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.FederatedGraph - 490, // 291: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.subgraphs:type_name -> wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.SubGraph + 490, // 289: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.namespaces:type_name -> wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.Namespace + 491, // 290: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.federatedGraphs:type_name -> wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.FederatedGraph + 492, // 291: wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.subgraphs:type_name -> wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse.SubGraph 9, // 292: wg.cosmo.platform.v1.UpdateFeatureSettingsRequest.featureId:type_name -> wg.cosmo.platform.v1.Feature 16, // 293: wg.cosmo.platform.v1.UpdateFeatureSettingsResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 294: wg.cosmo.platform.v1.GetSubgraphMembersResponse.response:type_name -> wg.cosmo.platform.v1.Response @@ -35407,7 +35568,7 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 299: wg.cosmo.platform.v1.GetClientsResponse.response:type_name -> wg.cosmo.platform.v1.Response 298, // 300: wg.cosmo.platform.v1.GetClientsResponse.clients:type_name -> wg.cosmo.platform.v1.ClientInfo 100, // 301: wg.cosmo.platform.v1.GetFieldUsageRequest.dateRange:type_name -> wg.cosmo.platform.v1.DateRange - 491, // 302: wg.cosmo.platform.v1.ClientWithOperations.operations:type_name -> wg.cosmo.platform.v1.ClientWithOperations.Operation + 493, // 302: wg.cosmo.platform.v1.ClientWithOperations.operations:type_name -> wg.cosmo.platform.v1.ClientWithOperations.Operation 16, // 303: wg.cosmo.platform.v1.GetFieldUsageResponse.response:type_name -> wg.cosmo.platform.v1.Response 110, // 304: wg.cosmo.platform.v1.GetFieldUsageResponse.request_series:type_name -> wg.cosmo.platform.v1.RequestSeriesItem 302, // 305: wg.cosmo.platform.v1.GetFieldUsageResponse.clients:type_name -> wg.cosmo.platform.v1.ClientWithOperations @@ -35471,7 +35632,7 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 355, // 363: wg.cosmo.platform.v1.GetFeatureFlagsResponse.feature_flags:type_name -> wg.cosmo.platform.v1.FeatureFlag 16, // 364: wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.response:type_name -> wg.cosmo.platform.v1.Response 355, // 365: wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.feature_flag:type_name -> wg.cosmo.platform.v1.FeatureFlag - 492, // 366: wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.federated_graphs:type_name -> wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.FfFederatedGraph + 494, // 366: wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.federated_graphs:type_name -> wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.FfFederatedGraph 60, // 367: wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.feature_subgraphs:type_name -> wg.cosmo.platform.v1.Subgraph 16, // 368: wg.cosmo.platform.v1.GetFeatureSubgraphsByFeatureFlagResponse.response:type_name -> wg.cosmo.platform.v1.Response 60, // 369: wg.cosmo.platform.v1.GetFeatureSubgraphsByFeatureFlagResponse.feature_subgraphs:type_name -> wg.cosmo.platform.v1.Subgraph @@ -35543,12 +35704,12 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 37, // 435: wg.cosmo.platform.v1.CreateProposalResponse.composedSchemaBreakingChanges:type_name -> wg.cosmo.platform.v1.FederatedGraphSchemaChange 16, // 436: wg.cosmo.platform.v1.GetProposalResponse.response:type_name -> wg.cosmo.platform.v1.Response 420, // 437: wg.cosmo.platform.v1.GetProposalResponse.proposal:type_name -> wg.cosmo.platform.v1.Proposal - 493, // 438: wg.cosmo.platform.v1.GetProposalResponse.currentSubgraphs:type_name -> wg.cosmo.platform.v1.GetProposalResponse.CurrentSubgraph + 495, // 438: wg.cosmo.platform.v1.GetProposalResponse.currentSubgraphs:type_name -> wg.cosmo.platform.v1.GetProposalResponse.CurrentSubgraph 16, // 439: wg.cosmo.platform.v1.GetProposalsByFederatedGraphResponse.response:type_name -> wg.cosmo.platform.v1.Response 420, // 440: wg.cosmo.platform.v1.GetProposalsByFederatedGraphResponse.proposals:type_name -> wg.cosmo.platform.v1.Proposal 16, // 441: wg.cosmo.platform.v1.GetProposalChecksResponse.response:type_name -> wg.cosmo.platform.v1.Response 74, // 442: wg.cosmo.platform.v1.GetProposalChecksResponse.checks:type_name -> wg.cosmo.platform.v1.SchemaCheck - 494, // 443: wg.cosmo.platform.v1.UpdateProposalRequest.updatedSubgraphs:type_name -> wg.cosmo.platform.v1.UpdateProposalRequest.UpdateProposalSubgraphs + 496, // 443: wg.cosmo.platform.v1.UpdateProposalRequest.updatedSubgraphs:type_name -> wg.cosmo.platform.v1.UpdateProposalRequest.UpdateProposalSubgraphs 16, // 444: wg.cosmo.platform.v1.UpdateProposalResponse.response:type_name -> wg.cosmo.platform.v1.Response 36, // 445: wg.cosmo.platform.v1.UpdateProposalResponse.breakingChanges:type_name -> wg.cosmo.platform.v1.SchemaChange 36, // 446: wg.cosmo.platform.v1.UpdateProposalResponse.nonBreakingChanges:type_name -> wg.cosmo.platform.v1.SchemaChange @@ -35571,15 +35732,15 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 100, // 463: wg.cosmo.platform.v1.GetOperationsRequest.dateRange:type_name -> wg.cosmo.platform.v1.DateRange 13, // 464: wg.cosmo.platform.v1.GetOperationsRequest.sortDirection:type_name -> wg.cosmo.platform.v1.SortDirection 16, // 465: wg.cosmo.platform.v1.GetOperationsResponse.response:type_name -> wg.cosmo.platform.v1.Response - 495, // 466: wg.cosmo.platform.v1.GetOperationsResponse.operations:type_name -> wg.cosmo.platform.v1.GetOperationsResponse.Operation + 497, // 466: wg.cosmo.platform.v1.GetOperationsResponse.operations:type_name -> wg.cosmo.platform.v1.GetOperationsResponse.Operation 16, // 467: wg.cosmo.platform.v1.GetClientsFromAnalyticsResponse.response:type_name -> wg.cosmo.platform.v1.Response - 496, // 468: wg.cosmo.platform.v1.GetClientsFromAnalyticsResponse.clients:type_name -> wg.cosmo.platform.v1.GetClientsFromAnalyticsResponse.Client + 498, // 468: wg.cosmo.platform.v1.GetClientsFromAnalyticsResponse.clients:type_name -> wg.cosmo.platform.v1.GetClientsFromAnalyticsResponse.Client 100, // 469: wg.cosmo.platform.v1.GetOperationClientsRequest.dateRange:type_name -> wg.cosmo.platform.v1.DateRange 16, // 470: wg.cosmo.platform.v1.GetOperationClientsResponse.response:type_name -> wg.cosmo.platform.v1.Response - 497, // 471: wg.cosmo.platform.v1.GetOperationClientsResponse.clients:type_name -> wg.cosmo.platform.v1.GetOperationClientsResponse.Client + 499, // 471: wg.cosmo.platform.v1.GetOperationClientsResponse.clients:type_name -> wg.cosmo.platform.v1.GetOperationClientsResponse.Client 100, // 472: wg.cosmo.platform.v1.GetOperationDeprecatedFieldsRequest.dateRange:type_name -> wg.cosmo.platform.v1.DateRange 16, // 473: wg.cosmo.platform.v1.GetOperationDeprecatedFieldsResponse.response:type_name -> wg.cosmo.platform.v1.Response - 498, // 474: wg.cosmo.platform.v1.GetOperationDeprecatedFieldsResponse.deprecatedFields:type_name -> wg.cosmo.platform.v1.GetOperationDeprecatedFieldsResponse.DeprecatedField + 500, // 474: wg.cosmo.platform.v1.GetOperationDeprecatedFieldsResponse.deprecatedFields:type_name -> wg.cosmo.platform.v1.GetOperationDeprecatedFieldsResponse.DeprecatedField 15, // 475: wg.cosmo.platform.v1.ValidateAndFetchPluginDataRequest.labels:type_name -> wg.cosmo.platform.v1.Label 16, // 476: wg.cosmo.platform.v1.ValidateAndFetchPluginDataResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 477: wg.cosmo.platform.v1.LinkSubgraphResponse.response:type_name -> wg.cosmo.platform.v1.Response @@ -35587,395 +35748,402 @@ var file_wg_cosmo_platform_v1_platform_proto_depIdxs = []int32{ 16, // 479: wg.cosmo.platform.v1.VerifyAPIKeyGraphAccessResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 480: wg.cosmo.platform.v1.InitializeCosmoUserResponse.response:type_name -> wg.cosmo.platform.v1.Response 16, // 481: wg.cosmo.platform.v1.ListOrganizationsResponse.response:type_name -> wg.cosmo.platform.v1.Response - 499, // 482: wg.cosmo.platform.v1.ListOrganizationsResponse.organizations:type_name -> wg.cosmo.platform.v1.ListOrganizationsResponse.OrganizationMembership + 501, // 482: wg.cosmo.platform.v1.ListOrganizationsResponse.organizations:type_name -> wg.cosmo.platform.v1.ListOrganizationsResponse.OrganizationMembership 16, // 483: wg.cosmo.platform.v1.RecomposeGraphResponse.response:type_name -> wg.cosmo.platform.v1.Response 38, // 484: wg.cosmo.platform.v1.RecomposeGraphResponse.compositionErrors:type_name -> wg.cosmo.platform.v1.CompositionError 40, // 485: wg.cosmo.platform.v1.RecomposeGraphResponse.deploymentErrors:type_name -> wg.cosmo.platform.v1.DeploymentError 39, // 486: wg.cosmo.platform.v1.RecomposeGraphResponse.compositionWarnings:type_name -> wg.cosmo.platform.v1.CompositionWarning 23, // 487: wg.cosmo.platform.v1.RecomposeGraphResponse.errorCounts:type_name -> wg.cosmo.platform.v1.SubgraphPublishStats - 16, // 488: wg.cosmo.platform.v1.GetOnboardingResponse.response:type_name -> wg.cosmo.platform.v1.Response - 16, // 489: wg.cosmo.platform.v1.CreateOnboardingResponse.response:type_name -> wg.cosmo.platform.v1.Response - 16, // 490: wg.cosmo.platform.v1.FinishOnboardingResponse.response:type_name -> wg.cosmo.platform.v1.Response - 15, // 491: wg.cosmo.platform.v1.SchemaCheck.CheckedSubgraph.labels:type_name -> wg.cosmo.platform.v1.Label - 36, // 492: wg.cosmo.platform.v1.GetCheckOperationsResponse.CheckOperation.impacting_changes:type_name -> wg.cosmo.platform.v1.SchemaChange - 107, // 493: wg.cosmo.platform.v1.AnalyticsViewRow.ValueEntry.value:type_name -> wg.cosmo.platform.v1.AnalyticsViewRowValue - 485, // 494: wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlan.features:type_name -> wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlanFeature - 55, // 495: wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.FfFederatedGraph.federated_graph:type_name -> wg.cosmo.platform.v1.FederatedGraph - 421, // 496: wg.cosmo.platform.v1.UpdateProposalRequest.UpdateProposalSubgraphs.subgraphs:type_name -> wg.cosmo.platform.v1.ProposalSubgraph - 14, // 497: wg.cosmo.platform.v1.GetOperationsResponse.Operation.type:type_name -> wg.cosmo.platform.v1.GetOperationsResponse.OperationType - 377, // 498: wg.cosmo.platform.v1.PlatformService.CreatePlaygroundScript:input_type -> wg.cosmo.platform.v1.CreatePlaygroundScriptRequest - 379, // 499: wg.cosmo.platform.v1.PlatformService.DeletePlaygroundScript:input_type -> wg.cosmo.platform.v1.DeletePlaygroundScriptRequest - 381, // 500: wg.cosmo.platform.v1.PlatformService.UpdatePlaygroundScript:input_type -> wg.cosmo.platform.v1.UpdatePlaygroundScriptRequest - 383, // 501: wg.cosmo.platform.v1.PlatformService.GetPlaygroundScripts:input_type -> wg.cosmo.platform.v1.GetPlaygroundScriptsRequest - 305, // 502: wg.cosmo.platform.v1.PlatformService.CreateNamespace:input_type -> wg.cosmo.platform.v1.CreateNamespaceRequest - 307, // 503: wg.cosmo.platform.v1.PlatformService.DeleteNamespace:input_type -> wg.cosmo.platform.v1.DeleteNamespaceRequest - 309, // 504: wg.cosmo.platform.v1.PlatformService.RenameNamespace:input_type -> wg.cosmo.platform.v1.RenameNamespaceRequest - 312, // 505: wg.cosmo.platform.v1.PlatformService.GetNamespaces:input_type -> wg.cosmo.platform.v1.GetNamespacesRequest - 390, // 506: wg.cosmo.platform.v1.PlatformService.GetNamespace:input_type -> wg.cosmo.platform.v1.GetNamespaceRequest - 395, // 507: wg.cosmo.platform.v1.PlatformService.GetWorkspace:input_type -> wg.cosmo.platform.v1.GetWorkspaceRequest - 339, // 508: wg.cosmo.platform.v1.PlatformService.CreateContract:input_type -> wg.cosmo.platform.v1.CreateContractRequest - 341, // 509: wg.cosmo.platform.v1.PlatformService.UpdateContract:input_type -> wg.cosmo.platform.v1.UpdateContractRequest - 314, // 510: wg.cosmo.platform.v1.PlatformService.MoveFederatedGraph:input_type -> wg.cosmo.platform.v1.MoveGraphRequest - 314, // 511: wg.cosmo.platform.v1.PlatformService.MoveSubgraph:input_type -> wg.cosmo.platform.v1.MoveGraphRequest - 314, // 512: wg.cosmo.platform.v1.PlatformService.MoveMonograph:input_type -> wg.cosmo.platform.v1.MoveGraphRequest - 28, // 513: wg.cosmo.platform.v1.PlatformService.CreateMonograph:input_type -> wg.cosmo.platform.v1.CreateMonographRequest - 18, // 514: wg.cosmo.platform.v1.PlatformService.PublishMonograph:input_type -> wg.cosmo.platform.v1.PublishMonographRequest - 33, // 515: wg.cosmo.platform.v1.PlatformService.DeleteMonograph:input_type -> wg.cosmo.platform.v1.DeleteMonographRequest - 92, // 516: wg.cosmo.platform.v1.PlatformService.UpdateMonograph:input_type -> wg.cosmo.platform.v1.UpdateMonographRequest - 334, // 517: wg.cosmo.platform.v1.PlatformService.MigrateMonograph:input_type -> wg.cosmo.platform.v1.MigrateMonographRequest - 31, // 518: wg.cosmo.platform.v1.PlatformService.CreateFederatedSubgraph:input_type -> wg.cosmo.platform.v1.CreateFederatedSubgraphRequest - 21, // 519: wg.cosmo.platform.v1.PlatformService.PublishFederatedSubgraph:input_type -> wg.cosmo.platform.v1.PublishFederatedSubgraphRequest - 30, // 520: wg.cosmo.platform.v1.PlatformService.CreateFederatedGraph:input_type -> wg.cosmo.platform.v1.CreateFederatedGraphRequest - 32, // 521: wg.cosmo.platform.v1.PlatformService.DeleteFederatedGraph:input_type -> wg.cosmo.platform.v1.DeleteFederatedGraphRequest - 35, // 522: wg.cosmo.platform.v1.PlatformService.DeleteFederatedSubgraph:input_type -> wg.cosmo.platform.v1.DeleteFederatedSubgraphRequest - 26, // 523: wg.cosmo.platform.v1.PlatformService.CheckSubgraphSchema:input_type -> wg.cosmo.platform.v1.CheckSubgraphSchemaRequest - 418, // 524: wg.cosmo.platform.v1.PlatformService.GetProposedSchemaOfCheckedSubgraph:input_type -> wg.cosmo.platform.v1.GetProposedSchemaOfCheckedSubgraphRequest - 27, // 525: wg.cosmo.platform.v1.PlatformService.FixSubgraphSchema:input_type -> wg.cosmo.platform.v1.FixSubgraphSchemaRequest - 90, // 526: wg.cosmo.platform.v1.PlatformService.UpdateFederatedGraph:input_type -> wg.cosmo.platform.v1.UpdateFederatedGraphRequest - 88, // 527: wg.cosmo.platform.v1.PlatformService.UpdateSubgraph:input_type -> wg.cosmo.platform.v1.UpdateSubgraphRequest - 94, // 528: wg.cosmo.platform.v1.PlatformService.CheckFederatedGraph:input_type -> wg.cosmo.platform.v1.CheckFederatedGraphRequest - 158, // 529: wg.cosmo.platform.v1.PlatformService.WhoAmI:input_type -> wg.cosmo.platform.v1.WhoAmIRequest - 161, // 530: wg.cosmo.platform.v1.PlatformService.GenerateRouterToken:input_type -> wg.cosmo.platform.v1.GenerateRouterTokenRequest - 163, // 531: wg.cosmo.platform.v1.PlatformService.GetRouterTokens:input_type -> wg.cosmo.platform.v1.GetRouterTokensRequest - 165, // 532: wg.cosmo.platform.v1.PlatformService.DeleteRouterToken:input_type -> wg.cosmo.platform.v1.DeleteRouterTokenRequest - 168, // 533: wg.cosmo.platform.v1.PlatformService.PublishPersistedOperations:input_type -> wg.cosmo.platform.v1.PublishPersistedOperationsRequest - 173, // 534: wg.cosmo.platform.v1.PlatformService.CheckPersistedOperationTraffic:input_type -> wg.cosmo.platform.v1.CheckPersistedOperationTrafficRequest - 171, // 535: wg.cosmo.platform.v1.PlatformService.DeletePersistedOperation:input_type -> wg.cosmo.platform.v1.DeletePersistedOperationRequest - 175, // 536: wg.cosmo.platform.v1.PlatformService.GetPersistedOperations:input_type -> wg.cosmo.platform.v1.GetPersistedOperationsRequest - 268, // 537: wg.cosmo.platform.v1.PlatformService.GetAuditLogs:input_type -> wg.cosmo.platform.v1.GetAuditLogsRequest - 454, // 538: wg.cosmo.platform.v1.PlatformService.InitializeCosmoUser:input_type -> wg.cosmo.platform.v1.InitializeCosmoUserRequest - 456, // 539: wg.cosmo.platform.v1.PlatformService.ListOrganizations:input_type -> wg.cosmo.platform.v1.ListOrganizationsRequest - 53, // 540: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphs:input_type -> wg.cosmo.platform.v1.GetFederatedGraphsRequest - 57, // 541: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphsBySubgraphLabels:input_type -> wg.cosmo.platform.v1.GetFederatedGraphsBySubgraphLabelsRequest - 62, // 542: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphByName:input_type -> wg.cosmo.platform.v1.GetFederatedGraphByNameRequest - 64, // 543: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphSDLByName:input_type -> wg.cosmo.platform.v1.GetFederatedGraphSDLByNameRequest - 59, // 544: wg.cosmo.platform.v1.PlatformService.GetSubgraphs:input_type -> wg.cosmo.platform.v1.GetSubgraphsRequest - 66, // 545: wg.cosmo.platform.v1.PlatformService.GetSubgraphByName:input_type -> wg.cosmo.platform.v1.GetSubgraphByNameRequest - 68, // 546: wg.cosmo.platform.v1.PlatformService.GetSubgraphSDLFromLatestComposition:input_type -> wg.cosmo.platform.v1.GetSubgraphSDLFromLatestCompositionRequest - 70, // 547: wg.cosmo.platform.v1.PlatformService.GetLatestSubgraphSDL:input_type -> wg.cosmo.platform.v1.GetLatestSubgraphSDLRequest - 73, // 548: wg.cosmo.platform.v1.PlatformService.GetChecksByFederatedGraphName:input_type -> wg.cosmo.platform.v1.GetChecksByFederatedGraphNameRequest - 76, // 549: wg.cosmo.platform.v1.PlatformService.GetCheckSummary:input_type -> wg.cosmo.platform.v1.GetCheckSummaryRequest - 79, // 550: wg.cosmo.platform.v1.PlatformService.GetCheckOperations:input_type -> wg.cosmo.platform.v1.GetCheckOperationsRequest - 235, // 551: wg.cosmo.platform.v1.PlatformService.ForceCheckSuccess:input_type -> wg.cosmo.platform.v1.ForceCheckSuccessRequest - 242, // 552: wg.cosmo.platform.v1.PlatformService.CreateOperationOverrides:input_type -> wg.cosmo.platform.v1.CreateOperationOverridesRequest - 246, // 553: wg.cosmo.platform.v1.PlatformService.RemoveOperationOverrides:input_type -> wg.cosmo.platform.v1.RemoveOperationOverridesRequest - 244, // 554: wg.cosmo.platform.v1.PlatformService.CreateOperationIgnoreAllOverride:input_type -> wg.cosmo.platform.v1.CreateOperationIgnoreAllOverrideRequest - 248, // 555: wg.cosmo.platform.v1.PlatformService.RemoveOperationIgnoreAllOverride:input_type -> wg.cosmo.platform.v1.RemoveOperationIgnoreAllOverrideRequest - 250, // 556: wg.cosmo.platform.v1.PlatformService.GetOperationOverrides:input_type -> wg.cosmo.platform.v1.GetOperationOverridesRequest - 252, // 557: wg.cosmo.platform.v1.PlatformService.GetAllOverrides:input_type -> wg.cosmo.platform.v1.GetAllOverridesRequest - 237, // 558: wg.cosmo.platform.v1.PlatformService.ToggleChangeOverridesForAllOperations:input_type -> wg.cosmo.platform.v1.ToggleChangeOverridesForAllOperationsRequest - 239, // 559: wg.cosmo.platform.v1.PlatformService.CreateIgnoreOverridesForAllOperations:input_type -> wg.cosmo.platform.v1.CreateIgnoreOverridesForAllOperationsRequest - 81, // 560: wg.cosmo.platform.v1.PlatformService.GetOperationContent:input_type -> wg.cosmo.platform.v1.GetOperationContentRequest - 83, // 561: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphChangelog:input_type -> wg.cosmo.platform.v1.GetFederatedGraphChangelogRequest - 115, // 562: wg.cosmo.platform.v1.PlatformService.CreateFederatedGraphToken:input_type -> wg.cosmo.platform.v1.CreateFederatedGraphTokenRequest - 212, // 563: wg.cosmo.platform.v1.PlatformService.GetOrganizationBySlug:input_type -> wg.cosmo.platform.v1.GetOrganizationBySlugRequest - 133, // 564: wg.cosmo.platform.v1.PlatformService.GetOrganizationMembers:input_type -> wg.cosmo.platform.v1.GetOrganizationMembersRequest - 131, // 565: wg.cosmo.platform.v1.PlatformService.GetPendingOrganizationMembers:input_type -> wg.cosmo.platform.v1.GetPendingOrganizationMembersRequest - 343, // 566: wg.cosmo.platform.v1.PlatformService.IsMemberLimitReached:input_type -> wg.cosmo.platform.v1.IsMemberLimitReachedRequest - 135, // 567: wg.cosmo.platform.v1.PlatformService.InviteUser:input_type -> wg.cosmo.platform.v1.InviteUserRequest - 137, // 568: wg.cosmo.platform.v1.PlatformService.InviteUsers:input_type -> wg.cosmo.platform.v1.InviteUsersRequest - 141, // 569: wg.cosmo.platform.v1.PlatformService.GetAPIKeys:input_type -> wg.cosmo.platform.v1.GetAPIKeysRequest - 143, // 570: wg.cosmo.platform.v1.PlatformService.CreateAPIKey:input_type -> wg.cosmo.platform.v1.CreateAPIKeyRequest - 147, // 571: wg.cosmo.platform.v1.PlatformService.UpdateAPIKey:input_type -> wg.cosmo.platform.v1.UpdateAPIKeyRequest - 145, // 572: wg.cosmo.platform.v1.PlatformService.DeleteAPIKey:input_type -> wg.cosmo.platform.v1.DeleteAPIKeyRequest - 149, // 573: wg.cosmo.platform.v1.PlatformService.RemoveOrganizationMember:input_type -> wg.cosmo.platform.v1.RemoveOrganizationMemberRequest - 151, // 574: wg.cosmo.platform.v1.PlatformService.RemoveInvitation:input_type -> wg.cosmo.platform.v1.RemoveInvitationRequest - 153, // 575: wg.cosmo.platform.v1.PlatformService.MigrateFromApollo:input_type -> wg.cosmo.platform.v1.MigrateFromApolloRequest - 119, // 576: wg.cosmo.platform.v1.PlatformService.CreateOrganizationGroup:input_type -> wg.cosmo.platform.v1.CreateOrganizationGroupRequest - 121, // 577: wg.cosmo.platform.v1.PlatformService.GetOrganizationGroups:input_type -> wg.cosmo.platform.v1.GetOrganizationGroupsRequest - 123, // 578: wg.cosmo.platform.v1.PlatformService.GetOrganizationGroupMembers:input_type -> wg.cosmo.platform.v1.GetOrganizationGroupMembersRequest - 125, // 579: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationGroup:input_type -> wg.cosmo.platform.v1.UpdateOrganizationGroupRequest - 127, // 580: wg.cosmo.platform.v1.PlatformService.DeleteOrganizationGroup:input_type -> wg.cosmo.platform.v1.DeleteOrganizationGroupRequest - 178, // 581: wg.cosmo.platform.v1.PlatformService.CreateOrganizationWebhookConfig:input_type -> wg.cosmo.platform.v1.CreateOrganizationWebhookConfigRequest - 180, // 582: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookConfigs:input_type -> wg.cosmo.platform.v1.GetOrganizationWebhookConfigsRequest - 182, // 583: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookMeta:input_type -> wg.cosmo.platform.v1.GetOrganizationWebhookMetaRequest - 184, // 584: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationWebhookConfig:input_type -> wg.cosmo.platform.v1.UpdateOrganizationWebhookConfigRequest - 186, // 585: wg.cosmo.platform.v1.PlatformService.DeleteOrganizationWebhookConfig:input_type -> wg.cosmo.platform.v1.DeleteOrganizationWebhookConfigRequest - 370, // 586: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookHistory:input_type -> wg.cosmo.platform.v1.GetOrganizationWebhookHistoryRequest - 375, // 587: wg.cosmo.platform.v1.PlatformService.GetWebhookDeliveryDetails:input_type -> wg.cosmo.platform.v1.GetWebhookDeliveryDetailsRequest - 373, // 588: wg.cosmo.platform.v1.PlatformService.RedeliverWebhook:input_type -> wg.cosmo.platform.v1.RedeliverWebhookRequest - 188, // 589: wg.cosmo.platform.v1.PlatformService.CreateIntegration:input_type -> wg.cosmo.platform.v1.CreateIntegrationRequest - 190, // 590: wg.cosmo.platform.v1.PlatformService.GetOrganizationIntegrations:input_type -> wg.cosmo.platform.v1.GetOrganizationIntegrationsRequest - 195, // 591: wg.cosmo.platform.v1.PlatformService.UpdateIntegrationConfig:input_type -> wg.cosmo.platform.v1.UpdateIntegrationConfigRequest - 197, // 592: wg.cosmo.platform.v1.PlatformService.DeleteIntegration:input_type -> wg.cosmo.platform.v1.DeleteIntegrationRequest - 345, // 593: wg.cosmo.platform.v1.PlatformService.DeleteUser:input_type -> wg.cosmo.platform.v1.DeleteUserRequest - 199, // 594: wg.cosmo.platform.v1.PlatformService.DeleteOrganization:input_type -> wg.cosmo.platform.v1.DeleteOrganizationRequest - 201, // 595: wg.cosmo.platform.v1.PlatformService.RestoreOrganization:input_type -> wg.cosmo.platform.v1.RestoreOrganizationRequest - 203, // 596: wg.cosmo.platform.v1.PlatformService.LeaveOrganization:input_type -> wg.cosmo.platform.v1.LeaveOrganizationRequest - 205, // 597: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationDetails:input_type -> wg.cosmo.platform.v1.UpdateOrganizationDetailsRequest - 207, // 598: wg.cosmo.platform.v1.PlatformService.UpdateOrgMemberGroup:input_type -> wg.cosmo.platform.v1.UpdateOrgMemberGroupRequest - 254, // 599: wg.cosmo.platform.v1.PlatformService.IsGitHubAppInstalled:input_type -> wg.cosmo.platform.v1.IsGitHubAppInstalledRequest - 257, // 600: wg.cosmo.platform.v1.PlatformService.CreateOIDCProvider:input_type -> wg.cosmo.platform.v1.CreateOIDCProviderRequest - 259, // 601: wg.cosmo.platform.v1.PlatformService.GetOIDCProvider:input_type -> wg.cosmo.platform.v1.GetOIDCProviderRequest - 261, // 602: wg.cosmo.platform.v1.PlatformService.DeleteOIDCProvider:input_type -> wg.cosmo.platform.v1.DeleteOIDCProviderRequest - 263, // 603: wg.cosmo.platform.v1.PlatformService.UpdateIDPMappers:input_type -> wg.cosmo.platform.v1.UpdateIDPMappersRequest - 299, // 604: wg.cosmo.platform.v1.PlatformService.GetClients:input_type -> wg.cosmo.platform.v1.GetClientsRequest - 296, // 605: wg.cosmo.platform.v1.PlatformService.GetRouters:input_type -> wg.cosmo.platform.v1.GetRoutersRequest - 271, // 606: wg.cosmo.platform.v1.PlatformService.GetInvitations:input_type -> wg.cosmo.platform.v1.GetInvitationsRequest - 273, // 607: wg.cosmo.platform.v1.PlatformService.AcceptOrDeclineInvitation:input_type -> wg.cosmo.platform.v1.AcceptOrDeclineInvitationRequest - 277, // 608: wg.cosmo.platform.v1.PlatformService.GetCompositions:input_type -> wg.cosmo.platform.v1.GetCompositionsRequest - 279, // 609: wg.cosmo.platform.v1.PlatformService.GetCompositionDetails:input_type -> wg.cosmo.platform.v1.GetCompositionDetailsRequest - 282, // 610: wg.cosmo.platform.v1.PlatformService.GetSdlBySchemaVersion:input_type -> wg.cosmo.platform.v1.GetSdlBySchemaVersionRequest - 284, // 611: wg.cosmo.platform.v1.PlatformService.GetChangelogBySchemaVersion:input_type -> wg.cosmo.platform.v1.GetChangelogBySchemaVersionRequest - 286, // 612: wg.cosmo.platform.v1.PlatformService.GetUserAccessibleResources:input_type -> wg.cosmo.platform.v1.GetUserAccessibleResourcesRequest - 288, // 613: wg.cosmo.platform.v1.PlatformService.UpdateFeatureSettings:input_type -> wg.cosmo.platform.v1.UpdateFeatureSettingsRequest - 290, // 614: wg.cosmo.platform.v1.PlatformService.GetSubgraphMembers:input_type -> wg.cosmo.platform.v1.GetSubgraphMembersRequest - 293, // 615: wg.cosmo.platform.v1.PlatformService.AddReadme:input_type -> wg.cosmo.platform.v1.AddReadmeRequest - 336, // 616: wg.cosmo.platform.v1.PlatformService.GetUserAccessiblePermissions:input_type -> wg.cosmo.platform.v1.GetUserAccessiblePermissionsRequest - 347, // 617: wg.cosmo.platform.v1.PlatformService.CreateFeatureFlag:input_type -> wg.cosmo.platform.v1.CreateFeatureFlagRequest - 353, // 618: wg.cosmo.platform.v1.PlatformService.DeleteFeatureFlag:input_type -> wg.cosmo.platform.v1.DeleteFeatureFlagRequest - 349, // 619: wg.cosmo.platform.v1.PlatformService.UpdateFeatureFlag:input_type -> wg.cosmo.platform.v1.UpdateFeatureFlagRequest - 351, // 620: wg.cosmo.platform.v1.PlatformService.EnableFeatureFlag:input_type -> wg.cosmo.platform.v1.EnableFeatureFlagRequest - 101, // 621: wg.cosmo.platform.v1.PlatformService.GetAnalyticsView:input_type -> wg.cosmo.platform.v1.GetAnalyticsViewRequest - 109, // 622: wg.cosmo.platform.v1.PlatformService.GetDashboardAnalyticsView:input_type -> wg.cosmo.platform.v1.GetDashboardAnalyticsViewRequest - 156, // 623: wg.cosmo.platform.v1.PlatformService.GetTrace:input_type -> wg.cosmo.platform.v1.GetTraceRequest - 222, // 624: wg.cosmo.platform.v1.PlatformService.GetGraphMetrics:input_type -> wg.cosmo.platform.v1.GetGraphMetricsRequest - 228, // 625: wg.cosmo.platform.v1.PlatformService.GetMetricsErrorRate:input_type -> wg.cosmo.platform.v1.GetMetricsErrorRateRequest - 231, // 626: wg.cosmo.platform.v1.PlatformService.GetSubgraphMetrics:input_type -> wg.cosmo.platform.v1.GetSubgraphMetricsRequest - 233, // 627: wg.cosmo.platform.v1.PlatformService.GetSubgraphMetricsErrorRate:input_type -> wg.cosmo.platform.v1.GetSubgraphMetricsErrorRateRequest - 301, // 628: wg.cosmo.platform.v1.PlatformService.GetFieldUsage:input_type -> wg.cosmo.platform.v1.GetFieldUsageRequest - 265, // 629: wg.cosmo.platform.v1.PlatformService.GetOrganizationRequestsCount:input_type -> wg.cosmo.platform.v1.GetOrganizationRequestsCountRequest - 209, // 630: wg.cosmo.platform.v1.PlatformService.CreateOrganization:input_type -> wg.cosmo.platform.v1.CreateOrganizationRequest - 322, // 631: wg.cosmo.platform.v1.PlatformService.EnableLintingForTheNamespace:input_type -> wg.cosmo.platform.v1.EnableLintingForTheNamespaceRequest - 325, // 632: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceLintConfig:input_type -> wg.cosmo.platform.v1.ConfigureNamespaceLintConfigRequest - 316, // 633: wg.cosmo.platform.v1.PlatformService.GetNamespaceLintConfig:input_type -> wg.cosmo.platform.v1.GetNamespaceLintConfigRequest - 318, // 634: wg.cosmo.platform.v1.PlatformService.GetNamespaceChecksConfig:input_type -> wg.cosmo.platform.v1.GetNamespaceChecksConfigurationRequest - 320, // 635: wg.cosmo.platform.v1.PlatformService.UpdateNamespaceChecksConfig:input_type -> wg.cosmo.platform.v1.UpdateNamespaceChecksConfigurationRequest - 327, // 636: wg.cosmo.platform.v1.PlatformService.EnableGraphPruning:input_type -> wg.cosmo.platform.v1.EnableGraphPruningRequest - 330, // 637: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceGraphPruningConfig:input_type -> wg.cosmo.platform.v1.ConfigureNamespaceGraphPruningConfigRequest - 332, // 638: wg.cosmo.platform.v1.PlatformService.GetNamespaceGraphPruningConfig:input_type -> wg.cosmo.platform.v1.GetNamespaceGraphPruningConfigRequest - 356, // 639: wg.cosmo.platform.v1.PlatformService.GetFeatureFlags:input_type -> wg.cosmo.platform.v1.GetFeatureFlagsRequest - 358, // 640: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagByName:input_type -> wg.cosmo.platform.v1.GetFeatureFlagByNameRequest - 360, // 641: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphsByFeatureFlag:input_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsByFeatureFlagRequest - 362, // 642: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphs:input_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsRequest - 364, // 643: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagsByFederatedGraph:input_type -> wg.cosmo.platform.v1.GetFeatureFlagsByFederatedGraphRequest - 366, // 644: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagsInLatestCompositionByFederatedGraph:input_type -> wg.cosmo.platform.v1.GetFeatureFlagsInLatestCompositionByFederatedGraphRequest - 368, // 645: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphsByFederatedGraph:input_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsByFederatedGraphRequest - 386, // 646: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphById:input_type -> wg.cosmo.platform.v1.GetFederatedGraphByIdRequest - 388, // 647: wg.cosmo.platform.v1.PlatformService.GetSubgraphById:input_type -> wg.cosmo.platform.v1.GetSubgraphByIdRequest - 397, // 648: wg.cosmo.platform.v1.PlatformService.PushCacheWarmerOperation:input_type -> wg.cosmo.platform.v1.PushCacheWarmerOperationRequest - 399, // 649: wg.cosmo.platform.v1.PlatformService.GetCacheWarmerOperations:input_type -> wg.cosmo.platform.v1.GetCacheWarmerOperationsRequest - 402, // 650: wg.cosmo.platform.v1.PlatformService.ComputeCacheWarmerOperations:input_type -> wg.cosmo.platform.v1.ComputeCacheWarmerOperationsRequest - 404, // 651: wg.cosmo.platform.v1.PlatformService.ConfigureCacheWarmer:input_type -> wg.cosmo.platform.v1.ConfigureCacheWarmerRequest - 406, // 652: wg.cosmo.platform.v1.PlatformService.GetCacheWarmerConfig:input_type -> wg.cosmo.platform.v1.GetCacheWarmerConfigRequest - 412, // 653: wg.cosmo.platform.v1.PlatformService.DeleteCacheWarmerOperation:input_type -> wg.cosmo.platform.v1.DeleteCacheWarmerOperationRequest - 408, // 654: wg.cosmo.platform.v1.PlatformService.GetSubgraphCheckExtensionsConfig:input_type -> wg.cosmo.platform.v1.GetSubgraphCheckExtensionsConfigRequest - 410, // 655: wg.cosmo.platform.v1.PlatformService.ConfigureSubgraphCheckExtensions:input_type -> wg.cosmo.platform.v1.ConfigureSubgraphCheckExtensionsRequest - 214, // 656: wg.cosmo.platform.v1.PlatformService.GetBillingPlans:input_type -> wg.cosmo.platform.v1.GetBillingPlansRequest - 216, // 657: wg.cosmo.platform.v1.PlatformService.CreateCheckoutSession:input_type -> wg.cosmo.platform.v1.CreateCheckoutSessionRequest - 218, // 658: wg.cosmo.platform.v1.PlatformService.CreateBillingPortalSession:input_type -> wg.cosmo.platform.v1.CreateBillingPortalSessionRequest - 220, // 659: wg.cosmo.platform.v1.PlatformService.UpgradePlan:input_type -> wg.cosmo.platform.v1.UpgradePlanRequest - 414, // 660: wg.cosmo.platform.v1.PlatformService.ListRouterCompatibilityVersions:input_type -> wg.cosmo.platform.v1.ListRouterCompatibilityVersionsRequest - 416, // 661: wg.cosmo.platform.v1.PlatformService.SetGraphRouterCompatibilityVersion:input_type -> wg.cosmo.platform.v1.SetGraphRouterCompatibilityVersionRequest - 422, // 662: wg.cosmo.platform.v1.PlatformService.CreateProposal:input_type -> wg.cosmo.platform.v1.CreateProposalRequest - 424, // 663: wg.cosmo.platform.v1.PlatformService.GetProposal:input_type -> wg.cosmo.platform.v1.GetProposalRequest - 430, // 664: wg.cosmo.platform.v1.PlatformService.UpdateProposal:input_type -> wg.cosmo.platform.v1.UpdateProposalRequest - 432, // 665: wg.cosmo.platform.v1.PlatformService.EnableProposalsForNamespace:input_type -> wg.cosmo.platform.v1.EnableProposalsForNamespaceRequest - 434, // 666: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceProposalConfig:input_type -> wg.cosmo.platform.v1.ConfigureNamespaceProposalConfigRequest - 436, // 667: wg.cosmo.platform.v1.PlatformService.GetNamespaceProposalConfig:input_type -> wg.cosmo.platform.v1.GetNamespaceProposalConfigRequest - 426, // 668: wg.cosmo.platform.v1.PlatformService.GetProposalsByFederatedGraph:input_type -> wg.cosmo.platform.v1.GetProposalsByFederatedGraphRequest - 428, // 669: wg.cosmo.platform.v1.PlatformService.GetProposalChecks:input_type -> wg.cosmo.platform.v1.GetProposalChecksRequest - 438, // 670: wg.cosmo.platform.v1.PlatformService.GetOperations:input_type -> wg.cosmo.platform.v1.GetOperationsRequest - 440, // 671: wg.cosmo.platform.v1.PlatformService.GetClientsFromAnalytics:input_type -> wg.cosmo.platform.v1.GetClientsFromAnalyticsRequest - 442, // 672: wg.cosmo.platform.v1.PlatformService.GetOperationClients:input_type -> wg.cosmo.platform.v1.GetOperationClientsRequest - 444, // 673: wg.cosmo.platform.v1.PlatformService.GetOperationDeprecatedFields:input_type -> wg.cosmo.platform.v1.GetOperationDeprecatedFieldsRequest - 446, // 674: wg.cosmo.platform.v1.PlatformService.ValidateAndFetchPluginData:input_type -> wg.cosmo.platform.v1.ValidateAndFetchPluginDataRequest - 448, // 675: wg.cosmo.platform.v1.PlatformService.LinkSubgraph:input_type -> wg.cosmo.platform.v1.LinkSubgraphRequest - 450, // 676: wg.cosmo.platform.v1.PlatformService.UnlinkSubgraph:input_type -> wg.cosmo.platform.v1.UnlinkSubgraphRequest - 452, // 677: wg.cosmo.platform.v1.PlatformService.VerifyAPIKeyGraphAccess:input_type -> wg.cosmo.platform.v1.VerifyAPIKeyGraphAccessRequest - 458, // 678: wg.cosmo.platform.v1.PlatformService.RecomposeGraph:input_type -> wg.cosmo.platform.v1.RecomposeGraphRequest - 460, // 679: wg.cosmo.platform.v1.PlatformService.GetOnboarding:input_type -> wg.cosmo.platform.v1.GetOnboardingRequest - 462, // 680: wg.cosmo.platform.v1.PlatformService.CreateOnboarding:input_type -> wg.cosmo.platform.v1.CreateOnboardingRequest - 464, // 681: wg.cosmo.platform.v1.PlatformService.FinishOnboarding:input_type -> wg.cosmo.platform.v1.FinishOnboardingRequest - 378, // 682: wg.cosmo.platform.v1.PlatformService.CreatePlaygroundScript:output_type -> wg.cosmo.platform.v1.CreatePlaygroundScriptResponse - 380, // 683: wg.cosmo.platform.v1.PlatformService.DeletePlaygroundScript:output_type -> wg.cosmo.platform.v1.DeletePlaygroundScriptResponse - 382, // 684: wg.cosmo.platform.v1.PlatformService.UpdatePlaygroundScript:output_type -> wg.cosmo.platform.v1.UpdatePlaygroundScriptResponse - 385, // 685: wg.cosmo.platform.v1.PlatformService.GetPlaygroundScripts:output_type -> wg.cosmo.platform.v1.GetPlaygroundScriptsResponse - 306, // 686: wg.cosmo.platform.v1.PlatformService.CreateNamespace:output_type -> wg.cosmo.platform.v1.CreateNamespaceResponse - 308, // 687: wg.cosmo.platform.v1.PlatformService.DeleteNamespace:output_type -> wg.cosmo.platform.v1.DeleteNamespaceResponse - 310, // 688: wg.cosmo.platform.v1.PlatformService.RenameNamespace:output_type -> wg.cosmo.platform.v1.RenameNamespaceResponse - 313, // 689: wg.cosmo.platform.v1.PlatformService.GetNamespaces:output_type -> wg.cosmo.platform.v1.GetNamespacesResponse - 391, // 690: wg.cosmo.platform.v1.PlatformService.GetNamespace:output_type -> wg.cosmo.platform.v1.GetNamespaceResponse - 396, // 691: wg.cosmo.platform.v1.PlatformService.GetWorkspace:output_type -> wg.cosmo.platform.v1.GetWorkspaceResponse - 340, // 692: wg.cosmo.platform.v1.PlatformService.CreateContract:output_type -> wg.cosmo.platform.v1.CreateContractResponse - 342, // 693: wg.cosmo.platform.v1.PlatformService.UpdateContract:output_type -> wg.cosmo.platform.v1.UpdateContractResponse - 315, // 694: wg.cosmo.platform.v1.PlatformService.MoveFederatedGraph:output_type -> wg.cosmo.platform.v1.MoveGraphResponse - 315, // 695: wg.cosmo.platform.v1.PlatformService.MoveSubgraph:output_type -> wg.cosmo.platform.v1.MoveGraphResponse - 315, // 696: wg.cosmo.platform.v1.PlatformService.MoveMonograph:output_type -> wg.cosmo.platform.v1.MoveGraphResponse - 29, // 697: wg.cosmo.platform.v1.PlatformService.CreateMonograph:output_type -> wg.cosmo.platform.v1.CreateMonographResponse - 19, // 698: wg.cosmo.platform.v1.PlatformService.PublishMonograph:output_type -> wg.cosmo.platform.v1.PublishMonographResponse - 34, // 699: wg.cosmo.platform.v1.PlatformService.DeleteMonograph:output_type -> wg.cosmo.platform.v1.DeleteMonographResponse - 93, // 700: wg.cosmo.platform.v1.PlatformService.UpdateMonograph:output_type -> wg.cosmo.platform.v1.UpdateMonographResponse - 335, // 701: wg.cosmo.platform.v1.PlatformService.MigrateMonograph:output_type -> wg.cosmo.platform.v1.MigrateMonographResponse - 50, // 702: wg.cosmo.platform.v1.PlatformService.CreateFederatedSubgraph:output_type -> wg.cosmo.platform.v1.CreateFederatedSubgraphResponse - 22, // 703: wg.cosmo.platform.v1.PlatformService.PublishFederatedSubgraph:output_type -> wg.cosmo.platform.v1.PublishFederatedSubgraphResponse - 49, // 704: wg.cosmo.platform.v1.PlatformService.CreateFederatedGraph:output_type -> wg.cosmo.platform.v1.CreateFederatedGraphResponse - 52, // 705: wg.cosmo.platform.v1.PlatformService.DeleteFederatedGraph:output_type -> wg.cosmo.platform.v1.DeleteFederatedGraphResponse - 51, // 706: wg.cosmo.platform.v1.PlatformService.DeleteFederatedSubgraph:output_type -> wg.cosmo.platform.v1.DeleteFederatedSubgraphResponse - 46, // 707: wg.cosmo.platform.v1.PlatformService.CheckSubgraphSchema:output_type -> wg.cosmo.platform.v1.CheckSubgraphSchemaResponse - 419, // 708: wg.cosmo.platform.v1.PlatformService.GetProposedSchemaOfCheckedSubgraph:output_type -> wg.cosmo.platform.v1.GetProposedSchemaOfCheckedSubgraphResponse - 48, // 709: wg.cosmo.platform.v1.PlatformService.FixSubgraphSchema:output_type -> wg.cosmo.platform.v1.FixSubgraphSchemaResponse - 91, // 710: wg.cosmo.platform.v1.PlatformService.UpdateFederatedGraph:output_type -> wg.cosmo.platform.v1.UpdateFederatedGraphResponse - 89, // 711: wg.cosmo.platform.v1.PlatformService.UpdateSubgraph:output_type -> wg.cosmo.platform.v1.UpdateSubgraphResponse - 95, // 712: wg.cosmo.platform.v1.PlatformService.CheckFederatedGraph:output_type -> wg.cosmo.platform.v1.CheckFederatedGraphResponse - 159, // 713: wg.cosmo.platform.v1.PlatformService.WhoAmI:output_type -> wg.cosmo.platform.v1.WhoAmIResponse - 162, // 714: wg.cosmo.platform.v1.PlatformService.GenerateRouterToken:output_type -> wg.cosmo.platform.v1.GenerateRouterTokenResponse - 164, // 715: wg.cosmo.platform.v1.PlatformService.GetRouterTokens:output_type -> wg.cosmo.platform.v1.GetRouterTokensResponse - 166, // 716: wg.cosmo.platform.v1.PlatformService.DeleteRouterToken:output_type -> wg.cosmo.platform.v1.DeleteRouterTokenResponse - 170, // 717: wg.cosmo.platform.v1.PlatformService.PublishPersistedOperations:output_type -> wg.cosmo.platform.v1.PublishPersistedOperationsResponse - 174, // 718: wg.cosmo.platform.v1.PlatformService.CheckPersistedOperationTraffic:output_type -> wg.cosmo.platform.v1.CheckPersistedOperationTrafficResponse - 172, // 719: wg.cosmo.platform.v1.PlatformService.DeletePersistedOperation:output_type -> wg.cosmo.platform.v1.DeletePersistedOperationResponse - 176, // 720: wg.cosmo.platform.v1.PlatformService.GetPersistedOperations:output_type -> wg.cosmo.platform.v1.GetPersistedOperationsResponse - 270, // 721: wg.cosmo.platform.v1.PlatformService.GetAuditLogs:output_type -> wg.cosmo.platform.v1.GetAuditLogsResponse - 455, // 722: wg.cosmo.platform.v1.PlatformService.InitializeCosmoUser:output_type -> wg.cosmo.platform.v1.InitializeCosmoUserResponse - 457, // 723: wg.cosmo.platform.v1.PlatformService.ListOrganizations:output_type -> wg.cosmo.platform.v1.ListOrganizationsResponse - 56, // 724: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphs:output_type -> wg.cosmo.platform.v1.GetFederatedGraphsResponse - 58, // 725: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphsBySubgraphLabels:output_type -> wg.cosmo.platform.v1.GetFederatedGraphsBySubgraphLabelsResponse - 63, // 726: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphByName:output_type -> wg.cosmo.platform.v1.GetFederatedGraphByNameResponse - 65, // 727: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphSDLByName:output_type -> wg.cosmo.platform.v1.GetFederatedGraphSDLByNameResponse - 61, // 728: wg.cosmo.platform.v1.PlatformService.GetSubgraphs:output_type -> wg.cosmo.platform.v1.GetSubgraphsResponse - 67, // 729: wg.cosmo.platform.v1.PlatformService.GetSubgraphByName:output_type -> wg.cosmo.platform.v1.GetSubgraphByNameResponse - 69, // 730: wg.cosmo.platform.v1.PlatformService.GetSubgraphSDLFromLatestComposition:output_type -> wg.cosmo.platform.v1.GetSubgraphSDLFromLatestCompositionResponse - 71, // 731: wg.cosmo.platform.v1.PlatformService.GetLatestSubgraphSDL:output_type -> wg.cosmo.platform.v1.GetLatestSubgraphSDLResponse - 75, // 732: wg.cosmo.platform.v1.PlatformService.GetChecksByFederatedGraphName:output_type -> wg.cosmo.platform.v1.GetChecksByFederatedGraphNameResponse - 78, // 733: wg.cosmo.platform.v1.PlatformService.GetCheckSummary:output_type -> wg.cosmo.platform.v1.GetCheckSummaryResponse - 80, // 734: wg.cosmo.platform.v1.PlatformService.GetCheckOperations:output_type -> wg.cosmo.platform.v1.GetCheckOperationsResponse - 236, // 735: wg.cosmo.platform.v1.PlatformService.ForceCheckSuccess:output_type -> wg.cosmo.platform.v1.ForceCheckSuccessResponse - 243, // 736: wg.cosmo.platform.v1.PlatformService.CreateOperationOverrides:output_type -> wg.cosmo.platform.v1.CreateOperationOverridesResponse - 247, // 737: wg.cosmo.platform.v1.PlatformService.RemoveOperationOverrides:output_type -> wg.cosmo.platform.v1.RemoveOperationOverridesResponse - 245, // 738: wg.cosmo.platform.v1.PlatformService.CreateOperationIgnoreAllOverride:output_type -> wg.cosmo.platform.v1.CreateOperationIgnoreAllOverrideResponse - 249, // 739: wg.cosmo.platform.v1.PlatformService.RemoveOperationIgnoreAllOverride:output_type -> wg.cosmo.platform.v1.RemoveOperationIgnoreAllOverrideResponse - 251, // 740: wg.cosmo.platform.v1.PlatformService.GetOperationOverrides:output_type -> wg.cosmo.platform.v1.GetOperationOverridesResponse - 253, // 741: wg.cosmo.platform.v1.PlatformService.GetAllOverrides:output_type -> wg.cosmo.platform.v1.GetAllOverridesResponse - 238, // 742: wg.cosmo.platform.v1.PlatformService.ToggleChangeOverridesForAllOperations:output_type -> wg.cosmo.platform.v1.ToggleChangeOverridesForAllOperationsResponse - 240, // 743: wg.cosmo.platform.v1.PlatformService.CreateIgnoreOverridesForAllOperations:output_type -> wg.cosmo.platform.v1.CreateIgnoreOverridesForAllOperationsResponse - 82, // 744: wg.cosmo.platform.v1.PlatformService.GetOperationContent:output_type -> wg.cosmo.platform.v1.GetOperationContentResponse - 86, // 745: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphChangelog:output_type -> wg.cosmo.platform.v1.GetFederatedGraphChangelogResponse - 116, // 746: wg.cosmo.platform.v1.PlatformService.CreateFederatedGraphToken:output_type -> wg.cosmo.platform.v1.CreateFederatedGraphTokenResponse - 213, // 747: wg.cosmo.platform.v1.PlatformService.GetOrganizationBySlug:output_type -> wg.cosmo.platform.v1.GetOrganizationBySlugResponse - 134, // 748: wg.cosmo.platform.v1.PlatformService.GetOrganizationMembers:output_type -> wg.cosmo.platform.v1.GetOrganizationMembersResponse - 132, // 749: wg.cosmo.platform.v1.PlatformService.GetPendingOrganizationMembers:output_type -> wg.cosmo.platform.v1.GetPendingOrganizationMembersResponse - 344, // 750: wg.cosmo.platform.v1.PlatformService.IsMemberLimitReached:output_type -> wg.cosmo.platform.v1.IsMemberLimitReachedResponse - 136, // 751: wg.cosmo.platform.v1.PlatformService.InviteUser:output_type -> wg.cosmo.platform.v1.InviteUserResponse - 139, // 752: wg.cosmo.platform.v1.PlatformService.InviteUsers:output_type -> wg.cosmo.platform.v1.InviteUsersResponse - 142, // 753: wg.cosmo.platform.v1.PlatformService.GetAPIKeys:output_type -> wg.cosmo.platform.v1.GetAPIKeysResponse - 144, // 754: wg.cosmo.platform.v1.PlatformService.CreateAPIKey:output_type -> wg.cosmo.platform.v1.CreateAPIKeyResponse - 148, // 755: wg.cosmo.platform.v1.PlatformService.UpdateAPIKey:output_type -> wg.cosmo.platform.v1.UpdateAPIKeyResponse - 146, // 756: wg.cosmo.platform.v1.PlatformService.DeleteAPIKey:output_type -> wg.cosmo.platform.v1.DeleteAPIKeyResponse - 150, // 757: wg.cosmo.platform.v1.PlatformService.RemoveOrganizationMember:output_type -> wg.cosmo.platform.v1.RemoveOrganizationMemberResponse - 152, // 758: wg.cosmo.platform.v1.PlatformService.RemoveInvitation:output_type -> wg.cosmo.platform.v1.RemoveInvitationResponse - 154, // 759: wg.cosmo.platform.v1.PlatformService.MigrateFromApollo:output_type -> wg.cosmo.platform.v1.MigrateFromApolloResponse - 120, // 760: wg.cosmo.platform.v1.PlatformService.CreateOrganizationGroup:output_type -> wg.cosmo.platform.v1.CreateOrganizationGroupResponse - 122, // 761: wg.cosmo.platform.v1.PlatformService.GetOrganizationGroups:output_type -> wg.cosmo.platform.v1.GetOrganizationGroupsResponse - 124, // 762: wg.cosmo.platform.v1.PlatformService.GetOrganizationGroupMembers:output_type -> wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse - 126, // 763: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationGroup:output_type -> wg.cosmo.platform.v1.UpdateOrganizationGroupResponse - 128, // 764: wg.cosmo.platform.v1.PlatformService.DeleteOrganizationGroup:output_type -> wg.cosmo.platform.v1.DeleteOrganizationGroupResponse - 179, // 765: wg.cosmo.platform.v1.PlatformService.CreateOrganizationWebhookConfig:output_type -> wg.cosmo.platform.v1.CreateOrganizationWebhookConfigResponse - 181, // 766: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookConfigs:output_type -> wg.cosmo.platform.v1.GetOrganizationWebhookConfigsResponse - 183, // 767: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookMeta:output_type -> wg.cosmo.platform.v1.GetOrganizationWebhookMetaResponse - 185, // 768: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationWebhookConfig:output_type -> wg.cosmo.platform.v1.UpdateOrganizationWebhookConfigResponse - 187, // 769: wg.cosmo.platform.v1.PlatformService.DeleteOrganizationWebhookConfig:output_type -> wg.cosmo.platform.v1.DeleteOrganizationWebhookConfigResponse - 372, // 770: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookHistory:output_type -> wg.cosmo.platform.v1.GetOrganizationWebhookHistoryResponse - 376, // 771: wg.cosmo.platform.v1.PlatformService.GetWebhookDeliveryDetails:output_type -> wg.cosmo.platform.v1.GetWebhookDeliveryDetailsResponse - 374, // 772: wg.cosmo.platform.v1.PlatformService.RedeliverWebhook:output_type -> wg.cosmo.platform.v1.RedeliverWebhookResponse - 189, // 773: wg.cosmo.platform.v1.PlatformService.CreateIntegration:output_type -> wg.cosmo.platform.v1.CreateIntegrationResponse - 194, // 774: wg.cosmo.platform.v1.PlatformService.GetOrganizationIntegrations:output_type -> wg.cosmo.platform.v1.GetOrganizationIntegrationsResponse - 196, // 775: wg.cosmo.platform.v1.PlatformService.UpdateIntegrationConfig:output_type -> wg.cosmo.platform.v1.UpdateIntegrationConfigResponse - 198, // 776: wg.cosmo.platform.v1.PlatformService.DeleteIntegration:output_type -> wg.cosmo.platform.v1.DeleteIntegrationResponse - 346, // 777: wg.cosmo.platform.v1.PlatformService.DeleteUser:output_type -> wg.cosmo.platform.v1.DeleteUserResponse - 200, // 778: wg.cosmo.platform.v1.PlatformService.DeleteOrganization:output_type -> wg.cosmo.platform.v1.DeleteOrganizationResponse - 202, // 779: wg.cosmo.platform.v1.PlatformService.RestoreOrganization:output_type -> wg.cosmo.platform.v1.RestoreOrganizationResponse - 204, // 780: wg.cosmo.platform.v1.PlatformService.LeaveOrganization:output_type -> wg.cosmo.platform.v1.LeaveOrganizationResponse - 206, // 781: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationDetails:output_type -> wg.cosmo.platform.v1.UpdateOrganizationDetailsResponse - 208, // 782: wg.cosmo.platform.v1.PlatformService.UpdateOrgMemberGroup:output_type -> wg.cosmo.platform.v1.UpdateOrgMemberGroupResponse - 255, // 783: wg.cosmo.platform.v1.PlatformService.IsGitHubAppInstalled:output_type -> wg.cosmo.platform.v1.IsGitHubAppInstalledResponse - 258, // 784: wg.cosmo.platform.v1.PlatformService.CreateOIDCProvider:output_type -> wg.cosmo.platform.v1.CreateOIDCProviderResponse - 260, // 785: wg.cosmo.platform.v1.PlatformService.GetOIDCProvider:output_type -> wg.cosmo.platform.v1.GetOIDCProviderResponse - 262, // 786: wg.cosmo.platform.v1.PlatformService.DeleteOIDCProvider:output_type -> wg.cosmo.platform.v1.DeleteOIDCProviderResponse - 264, // 787: wg.cosmo.platform.v1.PlatformService.UpdateIDPMappers:output_type -> wg.cosmo.platform.v1.UpdateIDPMappersResponse - 300, // 788: wg.cosmo.platform.v1.PlatformService.GetClients:output_type -> wg.cosmo.platform.v1.GetClientsResponse - 297, // 789: wg.cosmo.platform.v1.PlatformService.GetRouters:output_type -> wg.cosmo.platform.v1.GetRoutersResponse - 272, // 790: wg.cosmo.platform.v1.PlatformService.GetInvitations:output_type -> wg.cosmo.platform.v1.GetInvitationsResponse - 274, // 791: wg.cosmo.platform.v1.PlatformService.AcceptOrDeclineInvitation:output_type -> wg.cosmo.platform.v1.AcceptOrDeclineInvitationResponse - 278, // 792: wg.cosmo.platform.v1.PlatformService.GetCompositions:output_type -> wg.cosmo.platform.v1.GetCompositionsResponse - 281, // 793: wg.cosmo.platform.v1.PlatformService.GetCompositionDetails:output_type -> wg.cosmo.platform.v1.GetCompositionDetailsResponse - 283, // 794: wg.cosmo.platform.v1.PlatformService.GetSdlBySchemaVersion:output_type -> wg.cosmo.platform.v1.GetSdlBySchemaVersionResponse - 285, // 795: wg.cosmo.platform.v1.PlatformService.GetChangelogBySchemaVersion:output_type -> wg.cosmo.platform.v1.GetChangelogBySchemaVersionResponse - 287, // 796: wg.cosmo.platform.v1.PlatformService.GetUserAccessibleResources:output_type -> wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse - 289, // 797: wg.cosmo.platform.v1.PlatformService.UpdateFeatureSettings:output_type -> wg.cosmo.platform.v1.UpdateFeatureSettingsResponse - 292, // 798: wg.cosmo.platform.v1.PlatformService.GetSubgraphMembers:output_type -> wg.cosmo.platform.v1.GetSubgraphMembersResponse - 294, // 799: wg.cosmo.platform.v1.PlatformService.AddReadme:output_type -> wg.cosmo.platform.v1.AddReadmeResponse - 338, // 800: wg.cosmo.platform.v1.PlatformService.GetUserAccessiblePermissions:output_type -> wg.cosmo.platform.v1.GetUserAccessiblePermissionsResponse - 348, // 801: wg.cosmo.platform.v1.PlatformService.CreateFeatureFlag:output_type -> wg.cosmo.platform.v1.CreateFeatureFlagResponse - 354, // 802: wg.cosmo.platform.v1.PlatformService.DeleteFeatureFlag:output_type -> wg.cosmo.platform.v1.DeleteFeatureFlagResponse - 350, // 803: wg.cosmo.platform.v1.PlatformService.UpdateFeatureFlag:output_type -> wg.cosmo.platform.v1.UpdateFeatureFlagResponse - 352, // 804: wg.cosmo.platform.v1.PlatformService.EnableFeatureFlag:output_type -> wg.cosmo.platform.v1.EnableFeatureFlagResponse - 108, // 805: wg.cosmo.platform.v1.PlatformService.GetAnalyticsView:output_type -> wg.cosmo.platform.v1.GetAnalyticsViewResponse - 114, // 806: wg.cosmo.platform.v1.PlatformService.GetDashboardAnalyticsView:output_type -> wg.cosmo.platform.v1.GetDashboardAnalyticsViewResponse - 157, // 807: wg.cosmo.platform.v1.PlatformService.GetTrace:output_type -> wg.cosmo.platform.v1.GetTraceResponse - 223, // 808: wg.cosmo.platform.v1.PlatformService.GetGraphMetrics:output_type -> wg.cosmo.platform.v1.GetGraphMetricsResponse - 229, // 809: wg.cosmo.platform.v1.PlatformService.GetMetricsErrorRate:output_type -> wg.cosmo.platform.v1.GetMetricsErrorRateResponse - 232, // 810: wg.cosmo.platform.v1.PlatformService.GetSubgraphMetrics:output_type -> wg.cosmo.platform.v1.GetSubgraphMetricsResponse - 234, // 811: wg.cosmo.platform.v1.PlatformService.GetSubgraphMetricsErrorRate:output_type -> wg.cosmo.platform.v1.GetSubgraphMetricsErrorRateResponse - 304, // 812: wg.cosmo.platform.v1.PlatformService.GetFieldUsage:output_type -> wg.cosmo.platform.v1.GetFieldUsageResponse - 266, // 813: wg.cosmo.platform.v1.PlatformService.GetOrganizationRequestsCount:output_type -> wg.cosmo.platform.v1.GetOrganizationRequestsCountResponse - 210, // 814: wg.cosmo.platform.v1.PlatformService.CreateOrganization:output_type -> wg.cosmo.platform.v1.CreateOrganizationResponse - 323, // 815: wg.cosmo.platform.v1.PlatformService.EnableLintingForTheNamespace:output_type -> wg.cosmo.platform.v1.EnableLintingForTheNamespaceResponse - 326, // 816: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceLintConfig:output_type -> wg.cosmo.platform.v1.ConfigureNamespaceLintConfigResponse - 317, // 817: wg.cosmo.platform.v1.PlatformService.GetNamespaceLintConfig:output_type -> wg.cosmo.platform.v1.GetNamespaceLintConfigResponse - 319, // 818: wg.cosmo.platform.v1.PlatformService.GetNamespaceChecksConfig:output_type -> wg.cosmo.platform.v1.GetNamespaceChecksConfigurationResponse - 321, // 819: wg.cosmo.platform.v1.PlatformService.UpdateNamespaceChecksConfig:output_type -> wg.cosmo.platform.v1.UpdateNamespaceChecksConfigurationResponse - 328, // 820: wg.cosmo.platform.v1.PlatformService.EnableGraphPruning:output_type -> wg.cosmo.platform.v1.EnableGraphPruningResponse - 331, // 821: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceGraphPruningConfig:output_type -> wg.cosmo.platform.v1.ConfigureNamespaceGraphPruningConfigResponse - 333, // 822: wg.cosmo.platform.v1.PlatformService.GetNamespaceGraphPruningConfig:output_type -> wg.cosmo.platform.v1.GetNamespaceGraphPruningConfigResponse - 357, // 823: wg.cosmo.platform.v1.PlatformService.GetFeatureFlags:output_type -> wg.cosmo.platform.v1.GetFeatureFlagsResponse - 359, // 824: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagByName:output_type -> wg.cosmo.platform.v1.GetFeatureFlagByNameResponse - 361, // 825: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphsByFeatureFlag:output_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsByFeatureFlagResponse - 363, // 826: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphs:output_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsResponse - 365, // 827: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagsByFederatedGraph:output_type -> wg.cosmo.platform.v1.GetFeatureFlagsByFederatedGraphResponse - 367, // 828: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagsInLatestCompositionByFederatedGraph:output_type -> wg.cosmo.platform.v1.GetFeatureFlagsInLatestCompositionByFederatedGraphResponse - 369, // 829: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphsByFederatedGraph:output_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsByFederatedGraphResponse - 387, // 830: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphById:output_type -> wg.cosmo.platform.v1.GetFederatedGraphByIdResponse - 389, // 831: wg.cosmo.platform.v1.PlatformService.GetSubgraphById:output_type -> wg.cosmo.platform.v1.GetSubgraphByIdResponse - 398, // 832: wg.cosmo.platform.v1.PlatformService.PushCacheWarmerOperation:output_type -> wg.cosmo.platform.v1.PushCacheWarmerOperationResponse - 401, // 833: wg.cosmo.platform.v1.PlatformService.GetCacheWarmerOperations:output_type -> wg.cosmo.platform.v1.GetCacheWarmerOperationsResponse - 403, // 834: wg.cosmo.platform.v1.PlatformService.ComputeCacheWarmerOperations:output_type -> wg.cosmo.platform.v1.ComputeCacheWarmerOperationsResponse - 405, // 835: wg.cosmo.platform.v1.PlatformService.ConfigureCacheWarmer:output_type -> wg.cosmo.platform.v1.ConfigureCacheWarmerResponse - 407, // 836: wg.cosmo.platform.v1.PlatformService.GetCacheWarmerConfig:output_type -> wg.cosmo.platform.v1.GetCacheWarmerConfigResponse - 413, // 837: wg.cosmo.platform.v1.PlatformService.DeleteCacheWarmerOperation:output_type -> wg.cosmo.platform.v1.DeleteCacheWarmerOperationResponse - 409, // 838: wg.cosmo.platform.v1.PlatformService.GetSubgraphCheckExtensionsConfig:output_type -> wg.cosmo.platform.v1.GetSubgraphCheckExtensionsConfigResponse - 411, // 839: wg.cosmo.platform.v1.PlatformService.ConfigureSubgraphCheckExtensions:output_type -> wg.cosmo.platform.v1.ConfigureSubgraphCheckExtensionsResponse - 215, // 840: wg.cosmo.platform.v1.PlatformService.GetBillingPlans:output_type -> wg.cosmo.platform.v1.GetBillingPlansResponse - 217, // 841: wg.cosmo.platform.v1.PlatformService.CreateCheckoutSession:output_type -> wg.cosmo.platform.v1.CreateCheckoutSessionResponse - 219, // 842: wg.cosmo.platform.v1.PlatformService.CreateBillingPortalSession:output_type -> wg.cosmo.platform.v1.CreateBillingPortalSessionResponse - 221, // 843: wg.cosmo.platform.v1.PlatformService.UpgradePlan:output_type -> wg.cosmo.platform.v1.UpgradePlanResponse - 415, // 844: wg.cosmo.platform.v1.PlatformService.ListRouterCompatibilityVersions:output_type -> wg.cosmo.platform.v1.ListRouterCompatibilityVersionsResponse - 417, // 845: wg.cosmo.platform.v1.PlatformService.SetGraphRouterCompatibilityVersion:output_type -> wg.cosmo.platform.v1.SetGraphRouterCompatibilityVersionResponse - 423, // 846: wg.cosmo.platform.v1.PlatformService.CreateProposal:output_type -> wg.cosmo.platform.v1.CreateProposalResponse - 425, // 847: wg.cosmo.platform.v1.PlatformService.GetProposal:output_type -> wg.cosmo.platform.v1.GetProposalResponse - 431, // 848: wg.cosmo.platform.v1.PlatformService.UpdateProposal:output_type -> wg.cosmo.platform.v1.UpdateProposalResponse - 433, // 849: wg.cosmo.platform.v1.PlatformService.EnableProposalsForNamespace:output_type -> wg.cosmo.platform.v1.EnableProposalsForNamespaceResponse - 435, // 850: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceProposalConfig:output_type -> wg.cosmo.platform.v1.ConfigureNamespaceProposalConfigResponse - 437, // 851: wg.cosmo.platform.v1.PlatformService.GetNamespaceProposalConfig:output_type -> wg.cosmo.platform.v1.GetNamespaceProposalConfigResponse - 427, // 852: wg.cosmo.platform.v1.PlatformService.GetProposalsByFederatedGraph:output_type -> wg.cosmo.platform.v1.GetProposalsByFederatedGraphResponse - 429, // 853: wg.cosmo.platform.v1.PlatformService.GetProposalChecks:output_type -> wg.cosmo.platform.v1.GetProposalChecksResponse - 439, // 854: wg.cosmo.platform.v1.PlatformService.GetOperations:output_type -> wg.cosmo.platform.v1.GetOperationsResponse - 441, // 855: wg.cosmo.platform.v1.PlatformService.GetClientsFromAnalytics:output_type -> wg.cosmo.platform.v1.GetClientsFromAnalyticsResponse - 443, // 856: wg.cosmo.platform.v1.PlatformService.GetOperationClients:output_type -> wg.cosmo.platform.v1.GetOperationClientsResponse - 445, // 857: wg.cosmo.platform.v1.PlatformService.GetOperationDeprecatedFields:output_type -> wg.cosmo.platform.v1.GetOperationDeprecatedFieldsResponse - 447, // 858: wg.cosmo.platform.v1.PlatformService.ValidateAndFetchPluginData:output_type -> wg.cosmo.platform.v1.ValidateAndFetchPluginDataResponse - 449, // 859: wg.cosmo.platform.v1.PlatformService.LinkSubgraph:output_type -> wg.cosmo.platform.v1.LinkSubgraphResponse - 451, // 860: wg.cosmo.platform.v1.PlatformService.UnlinkSubgraph:output_type -> wg.cosmo.platform.v1.UnlinkSubgraphResponse - 453, // 861: wg.cosmo.platform.v1.PlatformService.VerifyAPIKeyGraphAccess:output_type -> wg.cosmo.platform.v1.VerifyAPIKeyGraphAccessResponse - 459, // 862: wg.cosmo.platform.v1.PlatformService.RecomposeGraph:output_type -> wg.cosmo.platform.v1.RecomposeGraphResponse - 461, // 863: wg.cosmo.platform.v1.PlatformService.GetOnboarding:output_type -> wg.cosmo.platform.v1.GetOnboardingResponse - 463, // 864: wg.cosmo.platform.v1.PlatformService.CreateOnboarding:output_type -> wg.cosmo.platform.v1.CreateOnboardingResponse - 465, // 865: wg.cosmo.platform.v1.PlatformService.FinishOnboarding:output_type -> wg.cosmo.platform.v1.FinishOnboardingResponse - 682, // [682:866] is the sub-list for method output_type - 498, // [498:682] is the sub-list for method input_type - 498, // [498:498] is the sub-list for extension type_name - 498, // [498:498] is the sub-list for extension extendee - 0, // [0:498] is the sub-list for field type_name + 16, // 488: wg.cosmo.platform.v1.RecomposeFeatureFlagResponse.response:type_name -> wg.cosmo.platform.v1.Response + 38, // 489: wg.cosmo.platform.v1.RecomposeFeatureFlagResponse.compositionErrors:type_name -> wg.cosmo.platform.v1.CompositionError + 40, // 490: wg.cosmo.platform.v1.RecomposeFeatureFlagResponse.deploymentErrors:type_name -> wg.cosmo.platform.v1.DeploymentError + 39, // 491: wg.cosmo.platform.v1.RecomposeFeatureFlagResponse.compositionWarnings:type_name -> wg.cosmo.platform.v1.CompositionWarning + 23, // 492: wg.cosmo.platform.v1.RecomposeFeatureFlagResponse.errorCounts:type_name -> wg.cosmo.platform.v1.SubgraphPublishStats + 16, // 493: wg.cosmo.platform.v1.GetOnboardingResponse.response:type_name -> wg.cosmo.platform.v1.Response + 16, // 494: wg.cosmo.platform.v1.CreateOnboardingResponse.response:type_name -> wg.cosmo.platform.v1.Response + 16, // 495: wg.cosmo.platform.v1.FinishOnboardingResponse.response:type_name -> wg.cosmo.platform.v1.Response + 15, // 496: wg.cosmo.platform.v1.SchemaCheck.CheckedSubgraph.labels:type_name -> wg.cosmo.platform.v1.Label + 36, // 497: wg.cosmo.platform.v1.GetCheckOperationsResponse.CheckOperation.impacting_changes:type_name -> wg.cosmo.platform.v1.SchemaChange + 107, // 498: wg.cosmo.platform.v1.AnalyticsViewRow.ValueEntry.value:type_name -> wg.cosmo.platform.v1.AnalyticsViewRowValue + 487, // 499: wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlan.features:type_name -> wg.cosmo.platform.v1.GetBillingPlansResponse.BillingPlanFeature + 55, // 500: wg.cosmo.platform.v1.GetFeatureFlagByNameResponse.FfFederatedGraph.federated_graph:type_name -> wg.cosmo.platform.v1.FederatedGraph + 421, // 501: wg.cosmo.platform.v1.UpdateProposalRequest.UpdateProposalSubgraphs.subgraphs:type_name -> wg.cosmo.platform.v1.ProposalSubgraph + 14, // 502: wg.cosmo.platform.v1.GetOperationsResponse.Operation.type:type_name -> wg.cosmo.platform.v1.GetOperationsResponse.OperationType + 377, // 503: wg.cosmo.platform.v1.PlatformService.CreatePlaygroundScript:input_type -> wg.cosmo.platform.v1.CreatePlaygroundScriptRequest + 379, // 504: wg.cosmo.platform.v1.PlatformService.DeletePlaygroundScript:input_type -> wg.cosmo.platform.v1.DeletePlaygroundScriptRequest + 381, // 505: wg.cosmo.platform.v1.PlatformService.UpdatePlaygroundScript:input_type -> wg.cosmo.platform.v1.UpdatePlaygroundScriptRequest + 383, // 506: wg.cosmo.platform.v1.PlatformService.GetPlaygroundScripts:input_type -> wg.cosmo.platform.v1.GetPlaygroundScriptsRequest + 305, // 507: wg.cosmo.platform.v1.PlatformService.CreateNamespace:input_type -> wg.cosmo.platform.v1.CreateNamespaceRequest + 307, // 508: wg.cosmo.platform.v1.PlatformService.DeleteNamespace:input_type -> wg.cosmo.platform.v1.DeleteNamespaceRequest + 309, // 509: wg.cosmo.platform.v1.PlatformService.RenameNamespace:input_type -> wg.cosmo.platform.v1.RenameNamespaceRequest + 312, // 510: wg.cosmo.platform.v1.PlatformService.GetNamespaces:input_type -> wg.cosmo.platform.v1.GetNamespacesRequest + 390, // 511: wg.cosmo.platform.v1.PlatformService.GetNamespace:input_type -> wg.cosmo.platform.v1.GetNamespaceRequest + 395, // 512: wg.cosmo.platform.v1.PlatformService.GetWorkspace:input_type -> wg.cosmo.platform.v1.GetWorkspaceRequest + 339, // 513: wg.cosmo.platform.v1.PlatformService.CreateContract:input_type -> wg.cosmo.platform.v1.CreateContractRequest + 341, // 514: wg.cosmo.platform.v1.PlatformService.UpdateContract:input_type -> wg.cosmo.platform.v1.UpdateContractRequest + 314, // 515: wg.cosmo.platform.v1.PlatformService.MoveFederatedGraph:input_type -> wg.cosmo.platform.v1.MoveGraphRequest + 314, // 516: wg.cosmo.platform.v1.PlatformService.MoveSubgraph:input_type -> wg.cosmo.platform.v1.MoveGraphRequest + 314, // 517: wg.cosmo.platform.v1.PlatformService.MoveMonograph:input_type -> wg.cosmo.platform.v1.MoveGraphRequest + 28, // 518: wg.cosmo.platform.v1.PlatformService.CreateMonograph:input_type -> wg.cosmo.platform.v1.CreateMonographRequest + 18, // 519: wg.cosmo.platform.v1.PlatformService.PublishMonograph:input_type -> wg.cosmo.platform.v1.PublishMonographRequest + 33, // 520: wg.cosmo.platform.v1.PlatformService.DeleteMonograph:input_type -> wg.cosmo.platform.v1.DeleteMonographRequest + 92, // 521: wg.cosmo.platform.v1.PlatformService.UpdateMonograph:input_type -> wg.cosmo.platform.v1.UpdateMonographRequest + 334, // 522: wg.cosmo.platform.v1.PlatformService.MigrateMonograph:input_type -> wg.cosmo.platform.v1.MigrateMonographRequest + 31, // 523: wg.cosmo.platform.v1.PlatformService.CreateFederatedSubgraph:input_type -> wg.cosmo.platform.v1.CreateFederatedSubgraphRequest + 21, // 524: wg.cosmo.platform.v1.PlatformService.PublishFederatedSubgraph:input_type -> wg.cosmo.platform.v1.PublishFederatedSubgraphRequest + 30, // 525: wg.cosmo.platform.v1.PlatformService.CreateFederatedGraph:input_type -> wg.cosmo.platform.v1.CreateFederatedGraphRequest + 32, // 526: wg.cosmo.platform.v1.PlatformService.DeleteFederatedGraph:input_type -> wg.cosmo.platform.v1.DeleteFederatedGraphRequest + 35, // 527: wg.cosmo.platform.v1.PlatformService.DeleteFederatedSubgraph:input_type -> wg.cosmo.platform.v1.DeleteFederatedSubgraphRequest + 26, // 528: wg.cosmo.platform.v1.PlatformService.CheckSubgraphSchema:input_type -> wg.cosmo.platform.v1.CheckSubgraphSchemaRequest + 418, // 529: wg.cosmo.platform.v1.PlatformService.GetProposedSchemaOfCheckedSubgraph:input_type -> wg.cosmo.platform.v1.GetProposedSchemaOfCheckedSubgraphRequest + 27, // 530: wg.cosmo.platform.v1.PlatformService.FixSubgraphSchema:input_type -> wg.cosmo.platform.v1.FixSubgraphSchemaRequest + 90, // 531: wg.cosmo.platform.v1.PlatformService.UpdateFederatedGraph:input_type -> wg.cosmo.platform.v1.UpdateFederatedGraphRequest + 88, // 532: wg.cosmo.platform.v1.PlatformService.UpdateSubgraph:input_type -> wg.cosmo.platform.v1.UpdateSubgraphRequest + 94, // 533: wg.cosmo.platform.v1.PlatformService.CheckFederatedGraph:input_type -> wg.cosmo.platform.v1.CheckFederatedGraphRequest + 158, // 534: wg.cosmo.platform.v1.PlatformService.WhoAmI:input_type -> wg.cosmo.platform.v1.WhoAmIRequest + 161, // 535: wg.cosmo.platform.v1.PlatformService.GenerateRouterToken:input_type -> wg.cosmo.platform.v1.GenerateRouterTokenRequest + 163, // 536: wg.cosmo.platform.v1.PlatformService.GetRouterTokens:input_type -> wg.cosmo.platform.v1.GetRouterTokensRequest + 165, // 537: wg.cosmo.platform.v1.PlatformService.DeleteRouterToken:input_type -> wg.cosmo.platform.v1.DeleteRouterTokenRequest + 168, // 538: wg.cosmo.platform.v1.PlatformService.PublishPersistedOperations:input_type -> wg.cosmo.platform.v1.PublishPersistedOperationsRequest + 173, // 539: wg.cosmo.platform.v1.PlatformService.CheckPersistedOperationTraffic:input_type -> wg.cosmo.platform.v1.CheckPersistedOperationTrafficRequest + 171, // 540: wg.cosmo.platform.v1.PlatformService.DeletePersistedOperation:input_type -> wg.cosmo.platform.v1.DeletePersistedOperationRequest + 175, // 541: wg.cosmo.platform.v1.PlatformService.GetPersistedOperations:input_type -> wg.cosmo.platform.v1.GetPersistedOperationsRequest + 268, // 542: wg.cosmo.platform.v1.PlatformService.GetAuditLogs:input_type -> wg.cosmo.platform.v1.GetAuditLogsRequest + 454, // 543: wg.cosmo.platform.v1.PlatformService.InitializeCosmoUser:input_type -> wg.cosmo.platform.v1.InitializeCosmoUserRequest + 456, // 544: wg.cosmo.platform.v1.PlatformService.ListOrganizations:input_type -> wg.cosmo.platform.v1.ListOrganizationsRequest + 53, // 545: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphs:input_type -> wg.cosmo.platform.v1.GetFederatedGraphsRequest + 57, // 546: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphsBySubgraphLabels:input_type -> wg.cosmo.platform.v1.GetFederatedGraphsBySubgraphLabelsRequest + 62, // 547: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphByName:input_type -> wg.cosmo.platform.v1.GetFederatedGraphByNameRequest + 64, // 548: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphSDLByName:input_type -> wg.cosmo.platform.v1.GetFederatedGraphSDLByNameRequest + 59, // 549: wg.cosmo.platform.v1.PlatformService.GetSubgraphs:input_type -> wg.cosmo.platform.v1.GetSubgraphsRequest + 66, // 550: wg.cosmo.platform.v1.PlatformService.GetSubgraphByName:input_type -> wg.cosmo.platform.v1.GetSubgraphByNameRequest + 68, // 551: wg.cosmo.platform.v1.PlatformService.GetSubgraphSDLFromLatestComposition:input_type -> wg.cosmo.platform.v1.GetSubgraphSDLFromLatestCompositionRequest + 70, // 552: wg.cosmo.platform.v1.PlatformService.GetLatestSubgraphSDL:input_type -> wg.cosmo.platform.v1.GetLatestSubgraphSDLRequest + 73, // 553: wg.cosmo.platform.v1.PlatformService.GetChecksByFederatedGraphName:input_type -> wg.cosmo.platform.v1.GetChecksByFederatedGraphNameRequest + 76, // 554: wg.cosmo.platform.v1.PlatformService.GetCheckSummary:input_type -> wg.cosmo.platform.v1.GetCheckSummaryRequest + 79, // 555: wg.cosmo.platform.v1.PlatformService.GetCheckOperations:input_type -> wg.cosmo.platform.v1.GetCheckOperationsRequest + 235, // 556: wg.cosmo.platform.v1.PlatformService.ForceCheckSuccess:input_type -> wg.cosmo.platform.v1.ForceCheckSuccessRequest + 242, // 557: wg.cosmo.platform.v1.PlatformService.CreateOperationOverrides:input_type -> wg.cosmo.platform.v1.CreateOperationOverridesRequest + 246, // 558: wg.cosmo.platform.v1.PlatformService.RemoveOperationOverrides:input_type -> wg.cosmo.platform.v1.RemoveOperationOverridesRequest + 244, // 559: wg.cosmo.platform.v1.PlatformService.CreateOperationIgnoreAllOverride:input_type -> wg.cosmo.platform.v1.CreateOperationIgnoreAllOverrideRequest + 248, // 560: wg.cosmo.platform.v1.PlatformService.RemoveOperationIgnoreAllOverride:input_type -> wg.cosmo.platform.v1.RemoveOperationIgnoreAllOverrideRequest + 250, // 561: wg.cosmo.platform.v1.PlatformService.GetOperationOverrides:input_type -> wg.cosmo.platform.v1.GetOperationOverridesRequest + 252, // 562: wg.cosmo.platform.v1.PlatformService.GetAllOverrides:input_type -> wg.cosmo.platform.v1.GetAllOverridesRequest + 237, // 563: wg.cosmo.platform.v1.PlatformService.ToggleChangeOverridesForAllOperations:input_type -> wg.cosmo.platform.v1.ToggleChangeOverridesForAllOperationsRequest + 239, // 564: wg.cosmo.platform.v1.PlatformService.CreateIgnoreOverridesForAllOperations:input_type -> wg.cosmo.platform.v1.CreateIgnoreOverridesForAllOperationsRequest + 81, // 565: wg.cosmo.platform.v1.PlatformService.GetOperationContent:input_type -> wg.cosmo.platform.v1.GetOperationContentRequest + 83, // 566: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphChangelog:input_type -> wg.cosmo.platform.v1.GetFederatedGraphChangelogRequest + 115, // 567: wg.cosmo.platform.v1.PlatformService.CreateFederatedGraphToken:input_type -> wg.cosmo.platform.v1.CreateFederatedGraphTokenRequest + 212, // 568: wg.cosmo.platform.v1.PlatformService.GetOrganizationBySlug:input_type -> wg.cosmo.platform.v1.GetOrganizationBySlugRequest + 133, // 569: wg.cosmo.platform.v1.PlatformService.GetOrganizationMembers:input_type -> wg.cosmo.platform.v1.GetOrganizationMembersRequest + 131, // 570: wg.cosmo.platform.v1.PlatformService.GetPendingOrganizationMembers:input_type -> wg.cosmo.platform.v1.GetPendingOrganizationMembersRequest + 343, // 571: wg.cosmo.platform.v1.PlatformService.IsMemberLimitReached:input_type -> wg.cosmo.platform.v1.IsMemberLimitReachedRequest + 135, // 572: wg.cosmo.platform.v1.PlatformService.InviteUser:input_type -> wg.cosmo.platform.v1.InviteUserRequest + 137, // 573: wg.cosmo.platform.v1.PlatformService.InviteUsers:input_type -> wg.cosmo.platform.v1.InviteUsersRequest + 141, // 574: wg.cosmo.platform.v1.PlatformService.GetAPIKeys:input_type -> wg.cosmo.platform.v1.GetAPIKeysRequest + 143, // 575: wg.cosmo.platform.v1.PlatformService.CreateAPIKey:input_type -> wg.cosmo.platform.v1.CreateAPIKeyRequest + 147, // 576: wg.cosmo.platform.v1.PlatformService.UpdateAPIKey:input_type -> wg.cosmo.platform.v1.UpdateAPIKeyRequest + 145, // 577: wg.cosmo.platform.v1.PlatformService.DeleteAPIKey:input_type -> wg.cosmo.platform.v1.DeleteAPIKeyRequest + 149, // 578: wg.cosmo.platform.v1.PlatformService.RemoveOrganizationMember:input_type -> wg.cosmo.platform.v1.RemoveOrganizationMemberRequest + 151, // 579: wg.cosmo.platform.v1.PlatformService.RemoveInvitation:input_type -> wg.cosmo.platform.v1.RemoveInvitationRequest + 153, // 580: wg.cosmo.platform.v1.PlatformService.MigrateFromApollo:input_type -> wg.cosmo.platform.v1.MigrateFromApolloRequest + 119, // 581: wg.cosmo.platform.v1.PlatformService.CreateOrganizationGroup:input_type -> wg.cosmo.platform.v1.CreateOrganizationGroupRequest + 121, // 582: wg.cosmo.platform.v1.PlatformService.GetOrganizationGroups:input_type -> wg.cosmo.platform.v1.GetOrganizationGroupsRequest + 123, // 583: wg.cosmo.platform.v1.PlatformService.GetOrganizationGroupMembers:input_type -> wg.cosmo.platform.v1.GetOrganizationGroupMembersRequest + 125, // 584: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationGroup:input_type -> wg.cosmo.platform.v1.UpdateOrganizationGroupRequest + 127, // 585: wg.cosmo.platform.v1.PlatformService.DeleteOrganizationGroup:input_type -> wg.cosmo.platform.v1.DeleteOrganizationGroupRequest + 178, // 586: wg.cosmo.platform.v1.PlatformService.CreateOrganizationWebhookConfig:input_type -> wg.cosmo.platform.v1.CreateOrganizationWebhookConfigRequest + 180, // 587: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookConfigs:input_type -> wg.cosmo.platform.v1.GetOrganizationWebhookConfigsRequest + 182, // 588: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookMeta:input_type -> wg.cosmo.platform.v1.GetOrganizationWebhookMetaRequest + 184, // 589: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationWebhookConfig:input_type -> wg.cosmo.platform.v1.UpdateOrganizationWebhookConfigRequest + 186, // 590: wg.cosmo.platform.v1.PlatformService.DeleteOrganizationWebhookConfig:input_type -> wg.cosmo.platform.v1.DeleteOrganizationWebhookConfigRequest + 370, // 591: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookHistory:input_type -> wg.cosmo.platform.v1.GetOrganizationWebhookHistoryRequest + 375, // 592: wg.cosmo.platform.v1.PlatformService.GetWebhookDeliveryDetails:input_type -> wg.cosmo.platform.v1.GetWebhookDeliveryDetailsRequest + 373, // 593: wg.cosmo.platform.v1.PlatformService.RedeliverWebhook:input_type -> wg.cosmo.platform.v1.RedeliverWebhookRequest + 188, // 594: wg.cosmo.platform.v1.PlatformService.CreateIntegration:input_type -> wg.cosmo.platform.v1.CreateIntegrationRequest + 190, // 595: wg.cosmo.platform.v1.PlatformService.GetOrganizationIntegrations:input_type -> wg.cosmo.platform.v1.GetOrganizationIntegrationsRequest + 195, // 596: wg.cosmo.platform.v1.PlatformService.UpdateIntegrationConfig:input_type -> wg.cosmo.platform.v1.UpdateIntegrationConfigRequest + 197, // 597: wg.cosmo.platform.v1.PlatformService.DeleteIntegration:input_type -> wg.cosmo.platform.v1.DeleteIntegrationRequest + 345, // 598: wg.cosmo.platform.v1.PlatformService.DeleteUser:input_type -> wg.cosmo.platform.v1.DeleteUserRequest + 199, // 599: wg.cosmo.platform.v1.PlatformService.DeleteOrganization:input_type -> wg.cosmo.platform.v1.DeleteOrganizationRequest + 201, // 600: wg.cosmo.platform.v1.PlatformService.RestoreOrganization:input_type -> wg.cosmo.platform.v1.RestoreOrganizationRequest + 203, // 601: wg.cosmo.platform.v1.PlatformService.LeaveOrganization:input_type -> wg.cosmo.platform.v1.LeaveOrganizationRequest + 205, // 602: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationDetails:input_type -> wg.cosmo.platform.v1.UpdateOrganizationDetailsRequest + 207, // 603: wg.cosmo.platform.v1.PlatformService.UpdateOrgMemberGroup:input_type -> wg.cosmo.platform.v1.UpdateOrgMemberGroupRequest + 254, // 604: wg.cosmo.platform.v1.PlatformService.IsGitHubAppInstalled:input_type -> wg.cosmo.platform.v1.IsGitHubAppInstalledRequest + 257, // 605: wg.cosmo.platform.v1.PlatformService.CreateOIDCProvider:input_type -> wg.cosmo.platform.v1.CreateOIDCProviderRequest + 259, // 606: wg.cosmo.platform.v1.PlatformService.GetOIDCProvider:input_type -> wg.cosmo.platform.v1.GetOIDCProviderRequest + 261, // 607: wg.cosmo.platform.v1.PlatformService.DeleteOIDCProvider:input_type -> wg.cosmo.platform.v1.DeleteOIDCProviderRequest + 263, // 608: wg.cosmo.platform.v1.PlatformService.UpdateIDPMappers:input_type -> wg.cosmo.platform.v1.UpdateIDPMappersRequest + 299, // 609: wg.cosmo.platform.v1.PlatformService.GetClients:input_type -> wg.cosmo.platform.v1.GetClientsRequest + 296, // 610: wg.cosmo.platform.v1.PlatformService.GetRouters:input_type -> wg.cosmo.platform.v1.GetRoutersRequest + 271, // 611: wg.cosmo.platform.v1.PlatformService.GetInvitations:input_type -> wg.cosmo.platform.v1.GetInvitationsRequest + 273, // 612: wg.cosmo.platform.v1.PlatformService.AcceptOrDeclineInvitation:input_type -> wg.cosmo.platform.v1.AcceptOrDeclineInvitationRequest + 277, // 613: wg.cosmo.platform.v1.PlatformService.GetCompositions:input_type -> wg.cosmo.platform.v1.GetCompositionsRequest + 279, // 614: wg.cosmo.platform.v1.PlatformService.GetCompositionDetails:input_type -> wg.cosmo.platform.v1.GetCompositionDetailsRequest + 282, // 615: wg.cosmo.platform.v1.PlatformService.GetSdlBySchemaVersion:input_type -> wg.cosmo.platform.v1.GetSdlBySchemaVersionRequest + 284, // 616: wg.cosmo.platform.v1.PlatformService.GetChangelogBySchemaVersion:input_type -> wg.cosmo.platform.v1.GetChangelogBySchemaVersionRequest + 286, // 617: wg.cosmo.platform.v1.PlatformService.GetUserAccessibleResources:input_type -> wg.cosmo.platform.v1.GetUserAccessibleResourcesRequest + 288, // 618: wg.cosmo.platform.v1.PlatformService.UpdateFeatureSettings:input_type -> wg.cosmo.platform.v1.UpdateFeatureSettingsRequest + 290, // 619: wg.cosmo.platform.v1.PlatformService.GetSubgraphMembers:input_type -> wg.cosmo.platform.v1.GetSubgraphMembersRequest + 293, // 620: wg.cosmo.platform.v1.PlatformService.AddReadme:input_type -> wg.cosmo.platform.v1.AddReadmeRequest + 336, // 621: wg.cosmo.platform.v1.PlatformService.GetUserAccessiblePermissions:input_type -> wg.cosmo.platform.v1.GetUserAccessiblePermissionsRequest + 347, // 622: wg.cosmo.platform.v1.PlatformService.CreateFeatureFlag:input_type -> wg.cosmo.platform.v1.CreateFeatureFlagRequest + 353, // 623: wg.cosmo.platform.v1.PlatformService.DeleteFeatureFlag:input_type -> wg.cosmo.platform.v1.DeleteFeatureFlagRequest + 349, // 624: wg.cosmo.platform.v1.PlatformService.UpdateFeatureFlag:input_type -> wg.cosmo.platform.v1.UpdateFeatureFlagRequest + 351, // 625: wg.cosmo.platform.v1.PlatformService.EnableFeatureFlag:input_type -> wg.cosmo.platform.v1.EnableFeatureFlagRequest + 101, // 626: wg.cosmo.platform.v1.PlatformService.GetAnalyticsView:input_type -> wg.cosmo.platform.v1.GetAnalyticsViewRequest + 109, // 627: wg.cosmo.platform.v1.PlatformService.GetDashboardAnalyticsView:input_type -> wg.cosmo.platform.v1.GetDashboardAnalyticsViewRequest + 156, // 628: wg.cosmo.platform.v1.PlatformService.GetTrace:input_type -> wg.cosmo.platform.v1.GetTraceRequest + 222, // 629: wg.cosmo.platform.v1.PlatformService.GetGraphMetrics:input_type -> wg.cosmo.platform.v1.GetGraphMetricsRequest + 228, // 630: wg.cosmo.platform.v1.PlatformService.GetMetricsErrorRate:input_type -> wg.cosmo.platform.v1.GetMetricsErrorRateRequest + 231, // 631: wg.cosmo.platform.v1.PlatformService.GetSubgraphMetrics:input_type -> wg.cosmo.platform.v1.GetSubgraphMetricsRequest + 233, // 632: wg.cosmo.platform.v1.PlatformService.GetSubgraphMetricsErrorRate:input_type -> wg.cosmo.platform.v1.GetSubgraphMetricsErrorRateRequest + 301, // 633: wg.cosmo.platform.v1.PlatformService.GetFieldUsage:input_type -> wg.cosmo.platform.v1.GetFieldUsageRequest + 265, // 634: wg.cosmo.platform.v1.PlatformService.GetOrganizationRequestsCount:input_type -> wg.cosmo.platform.v1.GetOrganizationRequestsCountRequest + 209, // 635: wg.cosmo.platform.v1.PlatformService.CreateOrganization:input_type -> wg.cosmo.platform.v1.CreateOrganizationRequest + 322, // 636: wg.cosmo.platform.v1.PlatformService.EnableLintingForTheNamespace:input_type -> wg.cosmo.platform.v1.EnableLintingForTheNamespaceRequest + 325, // 637: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceLintConfig:input_type -> wg.cosmo.platform.v1.ConfigureNamespaceLintConfigRequest + 316, // 638: wg.cosmo.platform.v1.PlatformService.GetNamespaceLintConfig:input_type -> wg.cosmo.platform.v1.GetNamespaceLintConfigRequest + 318, // 639: wg.cosmo.platform.v1.PlatformService.GetNamespaceChecksConfig:input_type -> wg.cosmo.platform.v1.GetNamespaceChecksConfigurationRequest + 320, // 640: wg.cosmo.platform.v1.PlatformService.UpdateNamespaceChecksConfig:input_type -> wg.cosmo.platform.v1.UpdateNamespaceChecksConfigurationRequest + 327, // 641: wg.cosmo.platform.v1.PlatformService.EnableGraphPruning:input_type -> wg.cosmo.platform.v1.EnableGraphPruningRequest + 330, // 642: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceGraphPruningConfig:input_type -> wg.cosmo.platform.v1.ConfigureNamespaceGraphPruningConfigRequest + 332, // 643: wg.cosmo.platform.v1.PlatformService.GetNamespaceGraphPruningConfig:input_type -> wg.cosmo.platform.v1.GetNamespaceGraphPruningConfigRequest + 356, // 644: wg.cosmo.platform.v1.PlatformService.GetFeatureFlags:input_type -> wg.cosmo.platform.v1.GetFeatureFlagsRequest + 358, // 645: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagByName:input_type -> wg.cosmo.platform.v1.GetFeatureFlagByNameRequest + 360, // 646: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphsByFeatureFlag:input_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsByFeatureFlagRequest + 362, // 647: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphs:input_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsRequest + 364, // 648: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagsByFederatedGraph:input_type -> wg.cosmo.platform.v1.GetFeatureFlagsByFederatedGraphRequest + 366, // 649: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagsInLatestCompositionByFederatedGraph:input_type -> wg.cosmo.platform.v1.GetFeatureFlagsInLatestCompositionByFederatedGraphRequest + 368, // 650: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphsByFederatedGraph:input_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsByFederatedGraphRequest + 386, // 651: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphById:input_type -> wg.cosmo.platform.v1.GetFederatedGraphByIdRequest + 388, // 652: wg.cosmo.platform.v1.PlatformService.GetSubgraphById:input_type -> wg.cosmo.platform.v1.GetSubgraphByIdRequest + 397, // 653: wg.cosmo.platform.v1.PlatformService.PushCacheWarmerOperation:input_type -> wg.cosmo.platform.v1.PushCacheWarmerOperationRequest + 399, // 654: wg.cosmo.platform.v1.PlatformService.GetCacheWarmerOperations:input_type -> wg.cosmo.platform.v1.GetCacheWarmerOperationsRequest + 402, // 655: wg.cosmo.platform.v1.PlatformService.ComputeCacheWarmerOperations:input_type -> wg.cosmo.platform.v1.ComputeCacheWarmerOperationsRequest + 404, // 656: wg.cosmo.platform.v1.PlatformService.ConfigureCacheWarmer:input_type -> wg.cosmo.platform.v1.ConfigureCacheWarmerRequest + 406, // 657: wg.cosmo.platform.v1.PlatformService.GetCacheWarmerConfig:input_type -> wg.cosmo.platform.v1.GetCacheWarmerConfigRequest + 412, // 658: wg.cosmo.platform.v1.PlatformService.DeleteCacheWarmerOperation:input_type -> wg.cosmo.platform.v1.DeleteCacheWarmerOperationRequest + 408, // 659: wg.cosmo.platform.v1.PlatformService.GetSubgraphCheckExtensionsConfig:input_type -> wg.cosmo.platform.v1.GetSubgraphCheckExtensionsConfigRequest + 410, // 660: wg.cosmo.platform.v1.PlatformService.ConfigureSubgraphCheckExtensions:input_type -> wg.cosmo.platform.v1.ConfigureSubgraphCheckExtensionsRequest + 214, // 661: wg.cosmo.platform.v1.PlatformService.GetBillingPlans:input_type -> wg.cosmo.platform.v1.GetBillingPlansRequest + 216, // 662: wg.cosmo.platform.v1.PlatformService.CreateCheckoutSession:input_type -> wg.cosmo.platform.v1.CreateCheckoutSessionRequest + 218, // 663: wg.cosmo.platform.v1.PlatformService.CreateBillingPortalSession:input_type -> wg.cosmo.platform.v1.CreateBillingPortalSessionRequest + 220, // 664: wg.cosmo.platform.v1.PlatformService.UpgradePlan:input_type -> wg.cosmo.platform.v1.UpgradePlanRequest + 414, // 665: wg.cosmo.platform.v1.PlatformService.ListRouterCompatibilityVersions:input_type -> wg.cosmo.platform.v1.ListRouterCompatibilityVersionsRequest + 416, // 666: wg.cosmo.platform.v1.PlatformService.SetGraphRouterCompatibilityVersion:input_type -> wg.cosmo.platform.v1.SetGraphRouterCompatibilityVersionRequest + 422, // 667: wg.cosmo.platform.v1.PlatformService.CreateProposal:input_type -> wg.cosmo.platform.v1.CreateProposalRequest + 424, // 668: wg.cosmo.platform.v1.PlatformService.GetProposal:input_type -> wg.cosmo.platform.v1.GetProposalRequest + 430, // 669: wg.cosmo.platform.v1.PlatformService.UpdateProposal:input_type -> wg.cosmo.platform.v1.UpdateProposalRequest + 432, // 670: wg.cosmo.platform.v1.PlatformService.EnableProposalsForNamespace:input_type -> wg.cosmo.platform.v1.EnableProposalsForNamespaceRequest + 434, // 671: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceProposalConfig:input_type -> wg.cosmo.platform.v1.ConfigureNamespaceProposalConfigRequest + 436, // 672: wg.cosmo.platform.v1.PlatformService.GetNamespaceProposalConfig:input_type -> wg.cosmo.platform.v1.GetNamespaceProposalConfigRequest + 426, // 673: wg.cosmo.platform.v1.PlatformService.GetProposalsByFederatedGraph:input_type -> wg.cosmo.platform.v1.GetProposalsByFederatedGraphRequest + 428, // 674: wg.cosmo.platform.v1.PlatformService.GetProposalChecks:input_type -> wg.cosmo.platform.v1.GetProposalChecksRequest + 438, // 675: wg.cosmo.platform.v1.PlatformService.GetOperations:input_type -> wg.cosmo.platform.v1.GetOperationsRequest + 440, // 676: wg.cosmo.platform.v1.PlatformService.GetClientsFromAnalytics:input_type -> wg.cosmo.platform.v1.GetClientsFromAnalyticsRequest + 442, // 677: wg.cosmo.platform.v1.PlatformService.GetOperationClients:input_type -> wg.cosmo.platform.v1.GetOperationClientsRequest + 444, // 678: wg.cosmo.platform.v1.PlatformService.GetOperationDeprecatedFields:input_type -> wg.cosmo.platform.v1.GetOperationDeprecatedFieldsRequest + 446, // 679: wg.cosmo.platform.v1.PlatformService.ValidateAndFetchPluginData:input_type -> wg.cosmo.platform.v1.ValidateAndFetchPluginDataRequest + 448, // 680: wg.cosmo.platform.v1.PlatformService.LinkSubgraph:input_type -> wg.cosmo.platform.v1.LinkSubgraphRequest + 450, // 681: wg.cosmo.platform.v1.PlatformService.UnlinkSubgraph:input_type -> wg.cosmo.platform.v1.UnlinkSubgraphRequest + 452, // 682: wg.cosmo.platform.v1.PlatformService.VerifyAPIKeyGraphAccess:input_type -> wg.cosmo.platform.v1.VerifyAPIKeyGraphAccessRequest + 458, // 683: wg.cosmo.platform.v1.PlatformService.RecomposeGraph:input_type -> wg.cosmo.platform.v1.RecomposeGraphRequest + 460, // 684: wg.cosmo.platform.v1.PlatformService.RecomposeFeatureFlag:input_type -> wg.cosmo.platform.v1.RecomposeFeatureFlagRequest + 462, // 685: wg.cosmo.platform.v1.PlatformService.GetOnboarding:input_type -> wg.cosmo.platform.v1.GetOnboardingRequest + 464, // 686: wg.cosmo.platform.v1.PlatformService.CreateOnboarding:input_type -> wg.cosmo.platform.v1.CreateOnboardingRequest + 466, // 687: wg.cosmo.platform.v1.PlatformService.FinishOnboarding:input_type -> wg.cosmo.platform.v1.FinishOnboardingRequest + 378, // 688: wg.cosmo.platform.v1.PlatformService.CreatePlaygroundScript:output_type -> wg.cosmo.platform.v1.CreatePlaygroundScriptResponse + 380, // 689: wg.cosmo.platform.v1.PlatformService.DeletePlaygroundScript:output_type -> wg.cosmo.platform.v1.DeletePlaygroundScriptResponse + 382, // 690: wg.cosmo.platform.v1.PlatformService.UpdatePlaygroundScript:output_type -> wg.cosmo.platform.v1.UpdatePlaygroundScriptResponse + 385, // 691: wg.cosmo.platform.v1.PlatformService.GetPlaygroundScripts:output_type -> wg.cosmo.platform.v1.GetPlaygroundScriptsResponse + 306, // 692: wg.cosmo.platform.v1.PlatformService.CreateNamespace:output_type -> wg.cosmo.platform.v1.CreateNamespaceResponse + 308, // 693: wg.cosmo.platform.v1.PlatformService.DeleteNamespace:output_type -> wg.cosmo.platform.v1.DeleteNamespaceResponse + 310, // 694: wg.cosmo.platform.v1.PlatformService.RenameNamespace:output_type -> wg.cosmo.platform.v1.RenameNamespaceResponse + 313, // 695: wg.cosmo.platform.v1.PlatformService.GetNamespaces:output_type -> wg.cosmo.platform.v1.GetNamespacesResponse + 391, // 696: wg.cosmo.platform.v1.PlatformService.GetNamespace:output_type -> wg.cosmo.platform.v1.GetNamespaceResponse + 396, // 697: wg.cosmo.platform.v1.PlatformService.GetWorkspace:output_type -> wg.cosmo.platform.v1.GetWorkspaceResponse + 340, // 698: wg.cosmo.platform.v1.PlatformService.CreateContract:output_type -> wg.cosmo.platform.v1.CreateContractResponse + 342, // 699: wg.cosmo.platform.v1.PlatformService.UpdateContract:output_type -> wg.cosmo.platform.v1.UpdateContractResponse + 315, // 700: wg.cosmo.platform.v1.PlatformService.MoveFederatedGraph:output_type -> wg.cosmo.platform.v1.MoveGraphResponse + 315, // 701: wg.cosmo.platform.v1.PlatformService.MoveSubgraph:output_type -> wg.cosmo.platform.v1.MoveGraphResponse + 315, // 702: wg.cosmo.platform.v1.PlatformService.MoveMonograph:output_type -> wg.cosmo.platform.v1.MoveGraphResponse + 29, // 703: wg.cosmo.platform.v1.PlatformService.CreateMonograph:output_type -> wg.cosmo.platform.v1.CreateMonographResponse + 19, // 704: wg.cosmo.platform.v1.PlatformService.PublishMonograph:output_type -> wg.cosmo.platform.v1.PublishMonographResponse + 34, // 705: wg.cosmo.platform.v1.PlatformService.DeleteMonograph:output_type -> wg.cosmo.platform.v1.DeleteMonographResponse + 93, // 706: wg.cosmo.platform.v1.PlatformService.UpdateMonograph:output_type -> wg.cosmo.platform.v1.UpdateMonographResponse + 335, // 707: wg.cosmo.platform.v1.PlatformService.MigrateMonograph:output_type -> wg.cosmo.platform.v1.MigrateMonographResponse + 50, // 708: wg.cosmo.platform.v1.PlatformService.CreateFederatedSubgraph:output_type -> wg.cosmo.platform.v1.CreateFederatedSubgraphResponse + 22, // 709: wg.cosmo.platform.v1.PlatformService.PublishFederatedSubgraph:output_type -> wg.cosmo.platform.v1.PublishFederatedSubgraphResponse + 49, // 710: wg.cosmo.platform.v1.PlatformService.CreateFederatedGraph:output_type -> wg.cosmo.platform.v1.CreateFederatedGraphResponse + 52, // 711: wg.cosmo.platform.v1.PlatformService.DeleteFederatedGraph:output_type -> wg.cosmo.platform.v1.DeleteFederatedGraphResponse + 51, // 712: wg.cosmo.platform.v1.PlatformService.DeleteFederatedSubgraph:output_type -> wg.cosmo.platform.v1.DeleteFederatedSubgraphResponse + 46, // 713: wg.cosmo.platform.v1.PlatformService.CheckSubgraphSchema:output_type -> wg.cosmo.platform.v1.CheckSubgraphSchemaResponse + 419, // 714: wg.cosmo.platform.v1.PlatformService.GetProposedSchemaOfCheckedSubgraph:output_type -> wg.cosmo.platform.v1.GetProposedSchemaOfCheckedSubgraphResponse + 48, // 715: wg.cosmo.platform.v1.PlatformService.FixSubgraphSchema:output_type -> wg.cosmo.platform.v1.FixSubgraphSchemaResponse + 91, // 716: wg.cosmo.platform.v1.PlatformService.UpdateFederatedGraph:output_type -> wg.cosmo.platform.v1.UpdateFederatedGraphResponse + 89, // 717: wg.cosmo.platform.v1.PlatformService.UpdateSubgraph:output_type -> wg.cosmo.platform.v1.UpdateSubgraphResponse + 95, // 718: wg.cosmo.platform.v1.PlatformService.CheckFederatedGraph:output_type -> wg.cosmo.platform.v1.CheckFederatedGraphResponse + 159, // 719: wg.cosmo.platform.v1.PlatformService.WhoAmI:output_type -> wg.cosmo.platform.v1.WhoAmIResponse + 162, // 720: wg.cosmo.platform.v1.PlatformService.GenerateRouterToken:output_type -> wg.cosmo.platform.v1.GenerateRouterTokenResponse + 164, // 721: wg.cosmo.platform.v1.PlatformService.GetRouterTokens:output_type -> wg.cosmo.platform.v1.GetRouterTokensResponse + 166, // 722: wg.cosmo.platform.v1.PlatformService.DeleteRouterToken:output_type -> wg.cosmo.platform.v1.DeleteRouterTokenResponse + 170, // 723: wg.cosmo.platform.v1.PlatformService.PublishPersistedOperations:output_type -> wg.cosmo.platform.v1.PublishPersistedOperationsResponse + 174, // 724: wg.cosmo.platform.v1.PlatformService.CheckPersistedOperationTraffic:output_type -> wg.cosmo.platform.v1.CheckPersistedOperationTrafficResponse + 172, // 725: wg.cosmo.platform.v1.PlatformService.DeletePersistedOperation:output_type -> wg.cosmo.platform.v1.DeletePersistedOperationResponse + 176, // 726: wg.cosmo.platform.v1.PlatformService.GetPersistedOperations:output_type -> wg.cosmo.platform.v1.GetPersistedOperationsResponse + 270, // 727: wg.cosmo.platform.v1.PlatformService.GetAuditLogs:output_type -> wg.cosmo.platform.v1.GetAuditLogsResponse + 455, // 728: wg.cosmo.platform.v1.PlatformService.InitializeCosmoUser:output_type -> wg.cosmo.platform.v1.InitializeCosmoUserResponse + 457, // 729: wg.cosmo.platform.v1.PlatformService.ListOrganizations:output_type -> wg.cosmo.platform.v1.ListOrganizationsResponse + 56, // 730: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphs:output_type -> wg.cosmo.platform.v1.GetFederatedGraphsResponse + 58, // 731: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphsBySubgraphLabels:output_type -> wg.cosmo.platform.v1.GetFederatedGraphsBySubgraphLabelsResponse + 63, // 732: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphByName:output_type -> wg.cosmo.platform.v1.GetFederatedGraphByNameResponse + 65, // 733: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphSDLByName:output_type -> wg.cosmo.platform.v1.GetFederatedGraphSDLByNameResponse + 61, // 734: wg.cosmo.platform.v1.PlatformService.GetSubgraphs:output_type -> wg.cosmo.platform.v1.GetSubgraphsResponse + 67, // 735: wg.cosmo.platform.v1.PlatformService.GetSubgraphByName:output_type -> wg.cosmo.platform.v1.GetSubgraphByNameResponse + 69, // 736: wg.cosmo.platform.v1.PlatformService.GetSubgraphSDLFromLatestComposition:output_type -> wg.cosmo.platform.v1.GetSubgraphSDLFromLatestCompositionResponse + 71, // 737: wg.cosmo.platform.v1.PlatformService.GetLatestSubgraphSDL:output_type -> wg.cosmo.platform.v1.GetLatestSubgraphSDLResponse + 75, // 738: wg.cosmo.platform.v1.PlatformService.GetChecksByFederatedGraphName:output_type -> wg.cosmo.platform.v1.GetChecksByFederatedGraphNameResponse + 78, // 739: wg.cosmo.platform.v1.PlatformService.GetCheckSummary:output_type -> wg.cosmo.platform.v1.GetCheckSummaryResponse + 80, // 740: wg.cosmo.platform.v1.PlatformService.GetCheckOperations:output_type -> wg.cosmo.platform.v1.GetCheckOperationsResponse + 236, // 741: wg.cosmo.platform.v1.PlatformService.ForceCheckSuccess:output_type -> wg.cosmo.platform.v1.ForceCheckSuccessResponse + 243, // 742: wg.cosmo.platform.v1.PlatformService.CreateOperationOverrides:output_type -> wg.cosmo.platform.v1.CreateOperationOverridesResponse + 247, // 743: wg.cosmo.platform.v1.PlatformService.RemoveOperationOverrides:output_type -> wg.cosmo.platform.v1.RemoveOperationOverridesResponse + 245, // 744: wg.cosmo.platform.v1.PlatformService.CreateOperationIgnoreAllOverride:output_type -> wg.cosmo.platform.v1.CreateOperationIgnoreAllOverrideResponse + 249, // 745: wg.cosmo.platform.v1.PlatformService.RemoveOperationIgnoreAllOverride:output_type -> wg.cosmo.platform.v1.RemoveOperationIgnoreAllOverrideResponse + 251, // 746: wg.cosmo.platform.v1.PlatformService.GetOperationOverrides:output_type -> wg.cosmo.platform.v1.GetOperationOverridesResponse + 253, // 747: wg.cosmo.platform.v1.PlatformService.GetAllOverrides:output_type -> wg.cosmo.platform.v1.GetAllOverridesResponse + 238, // 748: wg.cosmo.platform.v1.PlatformService.ToggleChangeOverridesForAllOperations:output_type -> wg.cosmo.platform.v1.ToggleChangeOverridesForAllOperationsResponse + 240, // 749: wg.cosmo.platform.v1.PlatformService.CreateIgnoreOverridesForAllOperations:output_type -> wg.cosmo.platform.v1.CreateIgnoreOverridesForAllOperationsResponse + 82, // 750: wg.cosmo.platform.v1.PlatformService.GetOperationContent:output_type -> wg.cosmo.platform.v1.GetOperationContentResponse + 86, // 751: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphChangelog:output_type -> wg.cosmo.platform.v1.GetFederatedGraphChangelogResponse + 116, // 752: wg.cosmo.platform.v1.PlatformService.CreateFederatedGraphToken:output_type -> wg.cosmo.platform.v1.CreateFederatedGraphTokenResponse + 213, // 753: wg.cosmo.platform.v1.PlatformService.GetOrganizationBySlug:output_type -> wg.cosmo.platform.v1.GetOrganizationBySlugResponse + 134, // 754: wg.cosmo.platform.v1.PlatformService.GetOrganizationMembers:output_type -> wg.cosmo.platform.v1.GetOrganizationMembersResponse + 132, // 755: wg.cosmo.platform.v1.PlatformService.GetPendingOrganizationMembers:output_type -> wg.cosmo.platform.v1.GetPendingOrganizationMembersResponse + 344, // 756: wg.cosmo.platform.v1.PlatformService.IsMemberLimitReached:output_type -> wg.cosmo.platform.v1.IsMemberLimitReachedResponse + 136, // 757: wg.cosmo.platform.v1.PlatformService.InviteUser:output_type -> wg.cosmo.platform.v1.InviteUserResponse + 139, // 758: wg.cosmo.platform.v1.PlatformService.InviteUsers:output_type -> wg.cosmo.platform.v1.InviteUsersResponse + 142, // 759: wg.cosmo.platform.v1.PlatformService.GetAPIKeys:output_type -> wg.cosmo.platform.v1.GetAPIKeysResponse + 144, // 760: wg.cosmo.platform.v1.PlatformService.CreateAPIKey:output_type -> wg.cosmo.platform.v1.CreateAPIKeyResponse + 148, // 761: wg.cosmo.platform.v1.PlatformService.UpdateAPIKey:output_type -> wg.cosmo.platform.v1.UpdateAPIKeyResponse + 146, // 762: wg.cosmo.platform.v1.PlatformService.DeleteAPIKey:output_type -> wg.cosmo.platform.v1.DeleteAPIKeyResponse + 150, // 763: wg.cosmo.platform.v1.PlatformService.RemoveOrganizationMember:output_type -> wg.cosmo.platform.v1.RemoveOrganizationMemberResponse + 152, // 764: wg.cosmo.platform.v1.PlatformService.RemoveInvitation:output_type -> wg.cosmo.platform.v1.RemoveInvitationResponse + 154, // 765: wg.cosmo.platform.v1.PlatformService.MigrateFromApollo:output_type -> wg.cosmo.platform.v1.MigrateFromApolloResponse + 120, // 766: wg.cosmo.platform.v1.PlatformService.CreateOrganizationGroup:output_type -> wg.cosmo.platform.v1.CreateOrganizationGroupResponse + 122, // 767: wg.cosmo.platform.v1.PlatformService.GetOrganizationGroups:output_type -> wg.cosmo.platform.v1.GetOrganizationGroupsResponse + 124, // 768: wg.cosmo.platform.v1.PlatformService.GetOrganizationGroupMembers:output_type -> wg.cosmo.platform.v1.GetOrganizationGroupMembersResponse + 126, // 769: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationGroup:output_type -> wg.cosmo.platform.v1.UpdateOrganizationGroupResponse + 128, // 770: wg.cosmo.platform.v1.PlatformService.DeleteOrganizationGroup:output_type -> wg.cosmo.platform.v1.DeleteOrganizationGroupResponse + 179, // 771: wg.cosmo.platform.v1.PlatformService.CreateOrganizationWebhookConfig:output_type -> wg.cosmo.platform.v1.CreateOrganizationWebhookConfigResponse + 181, // 772: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookConfigs:output_type -> wg.cosmo.platform.v1.GetOrganizationWebhookConfigsResponse + 183, // 773: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookMeta:output_type -> wg.cosmo.platform.v1.GetOrganizationWebhookMetaResponse + 185, // 774: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationWebhookConfig:output_type -> wg.cosmo.platform.v1.UpdateOrganizationWebhookConfigResponse + 187, // 775: wg.cosmo.platform.v1.PlatformService.DeleteOrganizationWebhookConfig:output_type -> wg.cosmo.platform.v1.DeleteOrganizationWebhookConfigResponse + 372, // 776: wg.cosmo.platform.v1.PlatformService.GetOrganizationWebhookHistory:output_type -> wg.cosmo.platform.v1.GetOrganizationWebhookHistoryResponse + 376, // 777: wg.cosmo.platform.v1.PlatformService.GetWebhookDeliveryDetails:output_type -> wg.cosmo.platform.v1.GetWebhookDeliveryDetailsResponse + 374, // 778: wg.cosmo.platform.v1.PlatformService.RedeliverWebhook:output_type -> wg.cosmo.platform.v1.RedeliverWebhookResponse + 189, // 779: wg.cosmo.platform.v1.PlatformService.CreateIntegration:output_type -> wg.cosmo.platform.v1.CreateIntegrationResponse + 194, // 780: wg.cosmo.platform.v1.PlatformService.GetOrganizationIntegrations:output_type -> wg.cosmo.platform.v1.GetOrganizationIntegrationsResponse + 196, // 781: wg.cosmo.platform.v1.PlatformService.UpdateIntegrationConfig:output_type -> wg.cosmo.platform.v1.UpdateIntegrationConfigResponse + 198, // 782: wg.cosmo.platform.v1.PlatformService.DeleteIntegration:output_type -> wg.cosmo.platform.v1.DeleteIntegrationResponse + 346, // 783: wg.cosmo.platform.v1.PlatformService.DeleteUser:output_type -> wg.cosmo.platform.v1.DeleteUserResponse + 200, // 784: wg.cosmo.platform.v1.PlatformService.DeleteOrganization:output_type -> wg.cosmo.platform.v1.DeleteOrganizationResponse + 202, // 785: wg.cosmo.platform.v1.PlatformService.RestoreOrganization:output_type -> wg.cosmo.platform.v1.RestoreOrganizationResponse + 204, // 786: wg.cosmo.platform.v1.PlatformService.LeaveOrganization:output_type -> wg.cosmo.platform.v1.LeaveOrganizationResponse + 206, // 787: wg.cosmo.platform.v1.PlatformService.UpdateOrganizationDetails:output_type -> wg.cosmo.platform.v1.UpdateOrganizationDetailsResponse + 208, // 788: wg.cosmo.platform.v1.PlatformService.UpdateOrgMemberGroup:output_type -> wg.cosmo.platform.v1.UpdateOrgMemberGroupResponse + 255, // 789: wg.cosmo.platform.v1.PlatformService.IsGitHubAppInstalled:output_type -> wg.cosmo.platform.v1.IsGitHubAppInstalledResponse + 258, // 790: wg.cosmo.platform.v1.PlatformService.CreateOIDCProvider:output_type -> wg.cosmo.platform.v1.CreateOIDCProviderResponse + 260, // 791: wg.cosmo.platform.v1.PlatformService.GetOIDCProvider:output_type -> wg.cosmo.platform.v1.GetOIDCProviderResponse + 262, // 792: wg.cosmo.platform.v1.PlatformService.DeleteOIDCProvider:output_type -> wg.cosmo.platform.v1.DeleteOIDCProviderResponse + 264, // 793: wg.cosmo.platform.v1.PlatformService.UpdateIDPMappers:output_type -> wg.cosmo.platform.v1.UpdateIDPMappersResponse + 300, // 794: wg.cosmo.platform.v1.PlatformService.GetClients:output_type -> wg.cosmo.platform.v1.GetClientsResponse + 297, // 795: wg.cosmo.platform.v1.PlatformService.GetRouters:output_type -> wg.cosmo.platform.v1.GetRoutersResponse + 272, // 796: wg.cosmo.platform.v1.PlatformService.GetInvitations:output_type -> wg.cosmo.platform.v1.GetInvitationsResponse + 274, // 797: wg.cosmo.platform.v1.PlatformService.AcceptOrDeclineInvitation:output_type -> wg.cosmo.platform.v1.AcceptOrDeclineInvitationResponse + 278, // 798: wg.cosmo.platform.v1.PlatformService.GetCompositions:output_type -> wg.cosmo.platform.v1.GetCompositionsResponse + 281, // 799: wg.cosmo.platform.v1.PlatformService.GetCompositionDetails:output_type -> wg.cosmo.platform.v1.GetCompositionDetailsResponse + 283, // 800: wg.cosmo.platform.v1.PlatformService.GetSdlBySchemaVersion:output_type -> wg.cosmo.platform.v1.GetSdlBySchemaVersionResponse + 285, // 801: wg.cosmo.platform.v1.PlatformService.GetChangelogBySchemaVersion:output_type -> wg.cosmo.platform.v1.GetChangelogBySchemaVersionResponse + 287, // 802: wg.cosmo.platform.v1.PlatformService.GetUserAccessibleResources:output_type -> wg.cosmo.platform.v1.GetUserAccessibleResourcesResponse + 289, // 803: wg.cosmo.platform.v1.PlatformService.UpdateFeatureSettings:output_type -> wg.cosmo.platform.v1.UpdateFeatureSettingsResponse + 292, // 804: wg.cosmo.platform.v1.PlatformService.GetSubgraphMembers:output_type -> wg.cosmo.platform.v1.GetSubgraphMembersResponse + 294, // 805: wg.cosmo.platform.v1.PlatformService.AddReadme:output_type -> wg.cosmo.platform.v1.AddReadmeResponse + 338, // 806: wg.cosmo.platform.v1.PlatformService.GetUserAccessiblePermissions:output_type -> wg.cosmo.platform.v1.GetUserAccessiblePermissionsResponse + 348, // 807: wg.cosmo.platform.v1.PlatformService.CreateFeatureFlag:output_type -> wg.cosmo.platform.v1.CreateFeatureFlagResponse + 354, // 808: wg.cosmo.platform.v1.PlatformService.DeleteFeatureFlag:output_type -> wg.cosmo.platform.v1.DeleteFeatureFlagResponse + 350, // 809: wg.cosmo.platform.v1.PlatformService.UpdateFeatureFlag:output_type -> wg.cosmo.platform.v1.UpdateFeatureFlagResponse + 352, // 810: wg.cosmo.platform.v1.PlatformService.EnableFeatureFlag:output_type -> wg.cosmo.platform.v1.EnableFeatureFlagResponse + 108, // 811: wg.cosmo.platform.v1.PlatformService.GetAnalyticsView:output_type -> wg.cosmo.platform.v1.GetAnalyticsViewResponse + 114, // 812: wg.cosmo.platform.v1.PlatformService.GetDashboardAnalyticsView:output_type -> wg.cosmo.platform.v1.GetDashboardAnalyticsViewResponse + 157, // 813: wg.cosmo.platform.v1.PlatformService.GetTrace:output_type -> wg.cosmo.platform.v1.GetTraceResponse + 223, // 814: wg.cosmo.platform.v1.PlatformService.GetGraphMetrics:output_type -> wg.cosmo.platform.v1.GetGraphMetricsResponse + 229, // 815: wg.cosmo.platform.v1.PlatformService.GetMetricsErrorRate:output_type -> wg.cosmo.platform.v1.GetMetricsErrorRateResponse + 232, // 816: wg.cosmo.platform.v1.PlatformService.GetSubgraphMetrics:output_type -> wg.cosmo.platform.v1.GetSubgraphMetricsResponse + 234, // 817: wg.cosmo.platform.v1.PlatformService.GetSubgraphMetricsErrorRate:output_type -> wg.cosmo.platform.v1.GetSubgraphMetricsErrorRateResponse + 304, // 818: wg.cosmo.platform.v1.PlatformService.GetFieldUsage:output_type -> wg.cosmo.platform.v1.GetFieldUsageResponse + 266, // 819: wg.cosmo.platform.v1.PlatformService.GetOrganizationRequestsCount:output_type -> wg.cosmo.platform.v1.GetOrganizationRequestsCountResponse + 210, // 820: wg.cosmo.platform.v1.PlatformService.CreateOrganization:output_type -> wg.cosmo.platform.v1.CreateOrganizationResponse + 323, // 821: wg.cosmo.platform.v1.PlatformService.EnableLintingForTheNamespace:output_type -> wg.cosmo.platform.v1.EnableLintingForTheNamespaceResponse + 326, // 822: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceLintConfig:output_type -> wg.cosmo.platform.v1.ConfigureNamespaceLintConfigResponse + 317, // 823: wg.cosmo.platform.v1.PlatformService.GetNamespaceLintConfig:output_type -> wg.cosmo.platform.v1.GetNamespaceLintConfigResponse + 319, // 824: wg.cosmo.platform.v1.PlatformService.GetNamespaceChecksConfig:output_type -> wg.cosmo.platform.v1.GetNamespaceChecksConfigurationResponse + 321, // 825: wg.cosmo.platform.v1.PlatformService.UpdateNamespaceChecksConfig:output_type -> wg.cosmo.platform.v1.UpdateNamespaceChecksConfigurationResponse + 328, // 826: wg.cosmo.platform.v1.PlatformService.EnableGraphPruning:output_type -> wg.cosmo.platform.v1.EnableGraphPruningResponse + 331, // 827: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceGraphPruningConfig:output_type -> wg.cosmo.platform.v1.ConfigureNamespaceGraphPruningConfigResponse + 333, // 828: wg.cosmo.platform.v1.PlatformService.GetNamespaceGraphPruningConfig:output_type -> wg.cosmo.platform.v1.GetNamespaceGraphPruningConfigResponse + 357, // 829: wg.cosmo.platform.v1.PlatformService.GetFeatureFlags:output_type -> wg.cosmo.platform.v1.GetFeatureFlagsResponse + 359, // 830: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagByName:output_type -> wg.cosmo.platform.v1.GetFeatureFlagByNameResponse + 361, // 831: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphsByFeatureFlag:output_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsByFeatureFlagResponse + 363, // 832: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphs:output_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsResponse + 365, // 833: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagsByFederatedGraph:output_type -> wg.cosmo.platform.v1.GetFeatureFlagsByFederatedGraphResponse + 367, // 834: wg.cosmo.platform.v1.PlatformService.GetFeatureFlagsInLatestCompositionByFederatedGraph:output_type -> wg.cosmo.platform.v1.GetFeatureFlagsInLatestCompositionByFederatedGraphResponse + 369, // 835: wg.cosmo.platform.v1.PlatformService.GetFeatureSubgraphsByFederatedGraph:output_type -> wg.cosmo.platform.v1.GetFeatureSubgraphsByFederatedGraphResponse + 387, // 836: wg.cosmo.platform.v1.PlatformService.GetFederatedGraphById:output_type -> wg.cosmo.platform.v1.GetFederatedGraphByIdResponse + 389, // 837: wg.cosmo.platform.v1.PlatformService.GetSubgraphById:output_type -> wg.cosmo.platform.v1.GetSubgraphByIdResponse + 398, // 838: wg.cosmo.platform.v1.PlatformService.PushCacheWarmerOperation:output_type -> wg.cosmo.platform.v1.PushCacheWarmerOperationResponse + 401, // 839: wg.cosmo.platform.v1.PlatformService.GetCacheWarmerOperations:output_type -> wg.cosmo.platform.v1.GetCacheWarmerOperationsResponse + 403, // 840: wg.cosmo.platform.v1.PlatformService.ComputeCacheWarmerOperations:output_type -> wg.cosmo.platform.v1.ComputeCacheWarmerOperationsResponse + 405, // 841: wg.cosmo.platform.v1.PlatformService.ConfigureCacheWarmer:output_type -> wg.cosmo.platform.v1.ConfigureCacheWarmerResponse + 407, // 842: wg.cosmo.platform.v1.PlatformService.GetCacheWarmerConfig:output_type -> wg.cosmo.platform.v1.GetCacheWarmerConfigResponse + 413, // 843: wg.cosmo.platform.v1.PlatformService.DeleteCacheWarmerOperation:output_type -> wg.cosmo.platform.v1.DeleteCacheWarmerOperationResponse + 409, // 844: wg.cosmo.platform.v1.PlatformService.GetSubgraphCheckExtensionsConfig:output_type -> wg.cosmo.platform.v1.GetSubgraphCheckExtensionsConfigResponse + 411, // 845: wg.cosmo.platform.v1.PlatformService.ConfigureSubgraphCheckExtensions:output_type -> wg.cosmo.platform.v1.ConfigureSubgraphCheckExtensionsResponse + 215, // 846: wg.cosmo.platform.v1.PlatformService.GetBillingPlans:output_type -> wg.cosmo.platform.v1.GetBillingPlansResponse + 217, // 847: wg.cosmo.platform.v1.PlatformService.CreateCheckoutSession:output_type -> wg.cosmo.platform.v1.CreateCheckoutSessionResponse + 219, // 848: wg.cosmo.platform.v1.PlatformService.CreateBillingPortalSession:output_type -> wg.cosmo.platform.v1.CreateBillingPortalSessionResponse + 221, // 849: wg.cosmo.platform.v1.PlatformService.UpgradePlan:output_type -> wg.cosmo.platform.v1.UpgradePlanResponse + 415, // 850: wg.cosmo.platform.v1.PlatformService.ListRouterCompatibilityVersions:output_type -> wg.cosmo.platform.v1.ListRouterCompatibilityVersionsResponse + 417, // 851: wg.cosmo.platform.v1.PlatformService.SetGraphRouterCompatibilityVersion:output_type -> wg.cosmo.platform.v1.SetGraphRouterCompatibilityVersionResponse + 423, // 852: wg.cosmo.platform.v1.PlatformService.CreateProposal:output_type -> wg.cosmo.platform.v1.CreateProposalResponse + 425, // 853: wg.cosmo.platform.v1.PlatformService.GetProposal:output_type -> wg.cosmo.platform.v1.GetProposalResponse + 431, // 854: wg.cosmo.platform.v1.PlatformService.UpdateProposal:output_type -> wg.cosmo.platform.v1.UpdateProposalResponse + 433, // 855: wg.cosmo.platform.v1.PlatformService.EnableProposalsForNamespace:output_type -> wg.cosmo.platform.v1.EnableProposalsForNamespaceResponse + 435, // 856: wg.cosmo.platform.v1.PlatformService.ConfigureNamespaceProposalConfig:output_type -> wg.cosmo.platform.v1.ConfigureNamespaceProposalConfigResponse + 437, // 857: wg.cosmo.platform.v1.PlatformService.GetNamespaceProposalConfig:output_type -> wg.cosmo.platform.v1.GetNamespaceProposalConfigResponse + 427, // 858: wg.cosmo.platform.v1.PlatformService.GetProposalsByFederatedGraph:output_type -> wg.cosmo.platform.v1.GetProposalsByFederatedGraphResponse + 429, // 859: wg.cosmo.platform.v1.PlatformService.GetProposalChecks:output_type -> wg.cosmo.platform.v1.GetProposalChecksResponse + 439, // 860: wg.cosmo.platform.v1.PlatformService.GetOperations:output_type -> wg.cosmo.platform.v1.GetOperationsResponse + 441, // 861: wg.cosmo.platform.v1.PlatformService.GetClientsFromAnalytics:output_type -> wg.cosmo.platform.v1.GetClientsFromAnalyticsResponse + 443, // 862: wg.cosmo.platform.v1.PlatformService.GetOperationClients:output_type -> wg.cosmo.platform.v1.GetOperationClientsResponse + 445, // 863: wg.cosmo.platform.v1.PlatformService.GetOperationDeprecatedFields:output_type -> wg.cosmo.platform.v1.GetOperationDeprecatedFieldsResponse + 447, // 864: wg.cosmo.platform.v1.PlatformService.ValidateAndFetchPluginData:output_type -> wg.cosmo.platform.v1.ValidateAndFetchPluginDataResponse + 449, // 865: wg.cosmo.platform.v1.PlatformService.LinkSubgraph:output_type -> wg.cosmo.platform.v1.LinkSubgraphResponse + 451, // 866: wg.cosmo.platform.v1.PlatformService.UnlinkSubgraph:output_type -> wg.cosmo.platform.v1.UnlinkSubgraphResponse + 453, // 867: wg.cosmo.platform.v1.PlatformService.VerifyAPIKeyGraphAccess:output_type -> wg.cosmo.platform.v1.VerifyAPIKeyGraphAccessResponse + 459, // 868: wg.cosmo.platform.v1.PlatformService.RecomposeGraph:output_type -> wg.cosmo.platform.v1.RecomposeGraphResponse + 461, // 869: wg.cosmo.platform.v1.PlatformService.RecomposeFeatureFlag:output_type -> wg.cosmo.platform.v1.RecomposeFeatureFlagResponse + 463, // 870: wg.cosmo.platform.v1.PlatformService.GetOnboarding:output_type -> wg.cosmo.platform.v1.GetOnboardingResponse + 465, // 871: wg.cosmo.platform.v1.PlatformService.CreateOnboarding:output_type -> wg.cosmo.platform.v1.CreateOnboardingResponse + 467, // 872: wg.cosmo.platform.v1.PlatformService.FinishOnboarding:output_type -> wg.cosmo.platform.v1.FinishOnboardingResponse + 688, // [688:873] is the sub-list for method output_type + 503, // [503:688] is the sub-list for method input_type + 503, // [503:503] is the sub-list for extension type_name + 503, // [503:503] is the sub-list for extension extendee + 0, // [0:503] is the sub-list for field type_name } func init() { file_wg_cosmo_platform_v1_platform_proto_init() } @@ -36082,11 +36250,13 @@ func file_wg_cosmo_platform_v1_platform_proto_init() { file_wg_cosmo_platform_v1_platform_proto_msgTypes[429].OneofWrappers = []any{} file_wg_cosmo_platform_v1_platform_proto_msgTypes[443].OneofWrappers = []any{} file_wg_cosmo_platform_v1_platform_proto_msgTypes[444].OneofWrappers = []any{} + file_wg_cosmo_platform_v1_platform_proto_msgTypes[445].OneofWrappers = []any{} file_wg_cosmo_platform_v1_platform_proto_msgTypes[446].OneofWrappers = []any{} file_wg_cosmo_platform_v1_platform_proto_msgTypes[448].OneofWrappers = []any{} - file_wg_cosmo_platform_v1_platform_proto_msgTypes[454].OneofWrappers = []any{} - file_wg_cosmo_platform_v1_platform_proto_msgTypes[470].OneofWrappers = []any{} - file_wg_cosmo_platform_v1_platform_proto_msgTypes[480].OneofWrappers = []any{ + file_wg_cosmo_platform_v1_platform_proto_msgTypes[450].OneofWrappers = []any{} + file_wg_cosmo_platform_v1_platform_proto_msgTypes[456].OneofWrappers = []any{} + file_wg_cosmo_platform_v1_platform_proto_msgTypes[472].OneofWrappers = []any{} + file_wg_cosmo_platform_v1_platform_proto_msgTypes[482].OneofWrappers = []any{ (*GetOperationsResponse_Operation_Latency)(nil), (*GetOperationsResponse_Operation_RequestCount)(nil), (*GetOperationsResponse_Operation_ErrorPercentage)(nil), @@ -36097,7 +36267,7 @@ func file_wg_cosmo_platform_v1_platform_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_wg_cosmo_platform_v1_platform_proto_rawDesc), len(file_wg_cosmo_platform_v1_platform_proto_rawDesc)), NumEnums: 15, - NumMessages: 485, + NumMessages: 487, NumExtensions: 0, NumServices: 1, }, diff --git a/connect-go/gen/proto/wg/cosmo/platform/v1/platformv1connect/platform.connect.go b/connect-go/gen/proto/wg/cosmo/platform/v1/platformv1connect/platform.connect.go index 147a48bc4d..0bcd4e26e7 100644 --- a/connect-go/gen/proto/wg/cosmo/platform/v1/platformv1connect/platform.connect.go +++ b/connect-go/gen/proto/wg/cosmo/platform/v1/platformv1connect/platform.connect.go @@ -577,6 +577,9 @@ const ( // PlatformServiceRecomposeGraphProcedure is the fully-qualified name of the PlatformService's // RecomposeGraph RPC. PlatformServiceRecomposeGraphProcedure = "/wg.cosmo.platform.v1.PlatformService/RecomposeGraph" + // PlatformServiceRecomposeFeatureFlagProcedure is the fully-qualified name of the PlatformService's + // RecomposeFeatureFlag RPC. + PlatformServiceRecomposeFeatureFlagProcedure = "/wg.cosmo.platform.v1.PlatformService/RecomposeFeatureFlag" // PlatformServiceGetOnboardingProcedure is the fully-qualified name of the PlatformService's // GetOnboarding RPC. PlatformServiceGetOnboardingProcedure = "/wg.cosmo.platform.v1.PlatformService/GetOnboarding" @@ -772,6 +775,7 @@ var ( platformServiceUnlinkSubgraphMethodDescriptor = platformServiceServiceDescriptor.Methods().ByName("UnlinkSubgraph") platformServiceVerifyAPIKeyGraphAccessMethodDescriptor = platformServiceServiceDescriptor.Methods().ByName("VerifyAPIKeyGraphAccess") platformServiceRecomposeGraphMethodDescriptor = platformServiceServiceDescriptor.Methods().ByName("RecomposeGraph") + platformServiceRecomposeFeatureFlagMethodDescriptor = platformServiceServiceDescriptor.Methods().ByName("RecomposeFeatureFlag") platformServiceGetOnboardingMethodDescriptor = platformServiceServiceDescriptor.Methods().ByName("GetOnboarding") platformServiceCreateOnboardingMethodDescriptor = platformServiceServiceDescriptor.Methods().ByName("CreateOnboarding") platformServiceFinishOnboardingMethodDescriptor = platformServiceServiceDescriptor.Methods().ByName("FinishOnboarding") @@ -1121,6 +1125,8 @@ type PlatformServiceClient interface { VerifyAPIKeyGraphAccess(context.Context, *connect.Request[v1.VerifyAPIKeyGraphAccessRequest]) (*connect.Response[v1.VerifyAPIKeyGraphAccessResponse], error) // RecomposeGraph triggers a recomposition of the federated graph (or monograph) using its current subgraphs RecomposeGraph(context.Context, *connect.Request[v1.RecomposeGraphRequest]) (*connect.Response[v1.RecomposeGraphResponse], error) + // RecomposeFeatureFlag triggers a recomposition of the feature flag using its current subgraphs + RecomposeFeatureFlag(context.Context, *connect.Request[v1.RecomposeFeatureFlagRequest]) (*connect.Response[v1.RecomposeFeatureFlagResponse], error) // Onboarding GetOnboarding(context.Context, *connect.Request[v1.GetOnboardingRequest]) (*connect.Response[v1.GetOnboardingResponse], error) CreateOnboarding(context.Context, *connect.Request[v1.CreateOnboardingRequest]) (*connect.Response[v1.CreateOnboardingResponse], error) @@ -2230,6 +2236,12 @@ func NewPlatformServiceClient(httpClient connect.HTTPClient, baseURL string, opt connect.WithSchema(platformServiceRecomposeGraphMethodDescriptor), connect.WithClientOptions(opts...), ), + recomposeFeatureFlag: connect.NewClient[v1.RecomposeFeatureFlagRequest, v1.RecomposeFeatureFlagResponse]( + httpClient, + baseURL+PlatformServiceRecomposeFeatureFlagProcedure, + connect.WithSchema(platformServiceRecomposeFeatureFlagMethodDescriptor), + connect.WithClientOptions(opts...), + ), getOnboarding: connect.NewClient[v1.GetOnboardingRequest, v1.GetOnboardingResponse]( httpClient, baseURL+PlatformServiceGetOnboardingProcedure, @@ -2434,6 +2446,7 @@ type platformServiceClient struct { unlinkSubgraph *connect.Client[v1.UnlinkSubgraphRequest, v1.UnlinkSubgraphResponse] verifyAPIKeyGraphAccess *connect.Client[v1.VerifyAPIKeyGraphAccessRequest, v1.VerifyAPIKeyGraphAccessResponse] recomposeGraph *connect.Client[v1.RecomposeGraphRequest, v1.RecomposeGraphResponse] + recomposeFeatureFlag *connect.Client[v1.RecomposeFeatureFlagRequest, v1.RecomposeFeatureFlagResponse] getOnboarding *connect.Client[v1.GetOnboardingRequest, v1.GetOnboardingResponse] createOnboarding *connect.Client[v1.CreateOnboardingRequest, v1.CreateOnboardingResponse] finishOnboarding *connect.Client[v1.FinishOnboardingRequest, v1.FinishOnboardingResponse] @@ -3383,6 +3396,11 @@ func (c *platformServiceClient) RecomposeGraph(ctx context.Context, req *connect return c.recomposeGraph.CallUnary(ctx, req) } +// RecomposeFeatureFlag calls wg.cosmo.platform.v1.PlatformService.RecomposeFeatureFlag. +func (c *platformServiceClient) RecomposeFeatureFlag(ctx context.Context, req *connect.Request[v1.RecomposeFeatureFlagRequest]) (*connect.Response[v1.RecomposeFeatureFlagResponse], error) { + return c.recomposeFeatureFlag.CallUnary(ctx, req) +} + // GetOnboarding calls wg.cosmo.platform.v1.PlatformService.GetOnboarding. func (c *platformServiceClient) GetOnboarding(ctx context.Context, req *connect.Request[v1.GetOnboardingRequest]) (*connect.Response[v1.GetOnboardingResponse], error) { return c.getOnboarding.CallUnary(ctx, req) @@ -3742,6 +3760,8 @@ type PlatformServiceHandler interface { VerifyAPIKeyGraphAccess(context.Context, *connect.Request[v1.VerifyAPIKeyGraphAccessRequest]) (*connect.Response[v1.VerifyAPIKeyGraphAccessResponse], error) // RecomposeGraph triggers a recomposition of the federated graph (or monograph) using its current subgraphs RecomposeGraph(context.Context, *connect.Request[v1.RecomposeGraphRequest]) (*connect.Response[v1.RecomposeGraphResponse], error) + // RecomposeFeatureFlag triggers a recomposition of the feature flag using its current subgraphs + RecomposeFeatureFlag(context.Context, *connect.Request[v1.RecomposeFeatureFlagRequest]) (*connect.Response[v1.RecomposeFeatureFlagResponse], error) // Onboarding GetOnboarding(context.Context, *connect.Request[v1.GetOnboardingRequest]) (*connect.Response[v1.GetOnboardingResponse], error) CreateOnboarding(context.Context, *connect.Request[v1.CreateOnboardingRequest]) (*connect.Response[v1.CreateOnboardingResponse], error) @@ -4847,6 +4867,12 @@ func NewPlatformServiceHandler(svc PlatformServiceHandler, opts ...connect.Handl connect.WithSchema(platformServiceRecomposeGraphMethodDescriptor), connect.WithHandlerOptions(opts...), ) + platformServiceRecomposeFeatureFlagHandler := connect.NewUnaryHandler( + PlatformServiceRecomposeFeatureFlagProcedure, + svc.RecomposeFeatureFlag, + connect.WithSchema(platformServiceRecomposeFeatureFlagMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) platformServiceGetOnboardingHandler := connect.NewUnaryHandler( PlatformServiceGetOnboardingProcedure, svc.GetOnboarding, @@ -5229,6 +5255,8 @@ func NewPlatformServiceHandler(svc PlatformServiceHandler, opts ...connect.Handl platformServiceVerifyAPIKeyGraphAccessHandler.ServeHTTP(w, r) case PlatformServiceRecomposeGraphProcedure: platformServiceRecomposeGraphHandler.ServeHTTP(w, r) + case PlatformServiceRecomposeFeatureFlagProcedure: + platformServiceRecomposeFeatureFlagHandler.ServeHTTP(w, r) case PlatformServiceGetOnboardingProcedure: platformServiceGetOnboardingHandler.ServeHTTP(w, r) case PlatformServiceCreateOnboardingProcedure: @@ -5968,6 +5996,10 @@ func (UnimplementedPlatformServiceHandler) RecomposeGraph(context.Context, *conn return nil, connect.NewError(connect.CodeUnimplemented, errors.New("wg.cosmo.platform.v1.PlatformService.RecomposeGraph is not implemented")) } +func (UnimplementedPlatformServiceHandler) RecomposeFeatureFlag(context.Context, *connect.Request[v1.RecomposeFeatureFlagRequest]) (*connect.Response[v1.RecomposeFeatureFlagResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("wg.cosmo.platform.v1.PlatformService.RecomposeFeatureFlag is not implemented")) +} + func (UnimplementedPlatformServiceHandler) GetOnboarding(context.Context, *connect.Request[v1.GetOnboardingRequest]) (*connect.Response[v1.GetOnboardingResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("wg.cosmo.platform.v1.PlatformService.GetOnboarding is not implemented")) } diff --git a/connect/src/wg/cosmo/platform/v1/platform-PlatformService_connectquery.ts b/connect/src/wg/cosmo/platform/v1/platform-PlatformService_connectquery.ts index 5956394889..1497289694 100644 --- a/connect/src/wg/cosmo/platform/v1/platform-PlatformService_connectquery.ts +++ b/connect/src/wg/cosmo/platform/v1/platform-PlatformService_connectquery.ts @@ -6,7 +6,7 @@ // @ts-nocheck import { MethodIdempotency, MethodKind } from "@bufbuild/protobuf"; -import { AcceptOrDeclineInvitationRequest, AcceptOrDeclineInvitationResponse, AddReadmeRequest, AddReadmeResponse, CheckFederatedGraphRequest, CheckFederatedGraphResponse, CheckPersistedOperationTrafficRequest, CheckPersistedOperationTrafficResponse, CheckSubgraphSchemaRequest, CheckSubgraphSchemaResponse, ComputeCacheWarmerOperationsRequest, ComputeCacheWarmerOperationsResponse, ConfigureCacheWarmerRequest, ConfigureCacheWarmerResponse, ConfigureNamespaceGraphPruningConfigRequest, ConfigureNamespaceGraphPruningConfigResponse, ConfigureNamespaceLintConfigRequest, ConfigureNamespaceLintConfigResponse, ConfigureNamespaceProposalConfigRequest, ConfigureNamespaceProposalConfigResponse, ConfigureSubgraphCheckExtensionsRequest, ConfigureSubgraphCheckExtensionsResponse, CreateAPIKeyRequest, CreateAPIKeyResponse, CreateBillingPortalSessionRequest, CreateBillingPortalSessionResponse, CreateCheckoutSessionRequest, CreateCheckoutSessionResponse, CreateContractRequest, CreateContractResponse, CreateFeatureFlagRequest, CreateFeatureFlagResponse, CreateFederatedGraphRequest, CreateFederatedGraphResponse, CreateFederatedGraphTokenRequest, CreateFederatedGraphTokenResponse, CreateFederatedSubgraphRequest, CreateFederatedSubgraphResponse, CreateIgnoreOverridesForAllOperationsRequest, CreateIgnoreOverridesForAllOperationsResponse, CreateIntegrationRequest, CreateIntegrationResponse, CreateMonographRequest, CreateMonographResponse, CreateNamespaceRequest, CreateNamespaceResponse, CreateOIDCProviderRequest, CreateOIDCProviderResponse, CreateOnboardingRequest, CreateOnboardingResponse, CreateOperationIgnoreAllOverrideRequest, CreateOperationIgnoreAllOverrideResponse, CreateOperationOverridesRequest, CreateOperationOverridesResponse, CreateOrganizationGroupRequest, CreateOrganizationGroupResponse, CreateOrganizationRequest, CreateOrganizationResponse, CreateOrganizationWebhookConfigRequest, CreateOrganizationWebhookConfigResponse, CreatePlaygroundScriptRequest, CreatePlaygroundScriptResponse, CreateProposalRequest, CreateProposalResponse, DeleteAPIKeyRequest, DeleteAPIKeyResponse, DeleteCacheWarmerOperationRequest, DeleteCacheWarmerOperationResponse, DeleteFeatureFlagRequest, DeleteFeatureFlagResponse, DeleteFederatedGraphRequest, DeleteFederatedGraphResponse, DeleteFederatedSubgraphRequest, DeleteFederatedSubgraphResponse, DeleteIntegrationRequest, DeleteIntegrationResponse, DeleteMonographRequest, DeleteMonographResponse, DeleteNamespaceRequest, DeleteNamespaceResponse, DeleteOIDCProviderRequest, DeleteOIDCProviderResponse, DeleteOrganizationGroupRequest, DeleteOrganizationGroupResponse, DeleteOrganizationRequest, DeleteOrganizationResponse, DeleteOrganizationWebhookConfigRequest, DeleteOrganizationWebhookConfigResponse, DeletePersistedOperationRequest, DeletePersistedOperationResponse, DeletePlaygroundScriptRequest, DeletePlaygroundScriptResponse, DeleteRouterTokenRequest, DeleteRouterTokenResponse, DeleteUserRequest, DeleteUserResponse, EnableFeatureFlagRequest, EnableFeatureFlagResponse, EnableGraphPruningRequest, EnableGraphPruningResponse, EnableLintingForTheNamespaceRequest, EnableLintingForTheNamespaceResponse, EnableProposalsForNamespaceRequest, EnableProposalsForNamespaceResponse, FinishOnboardingRequest, FinishOnboardingResponse, FixSubgraphSchemaRequest, FixSubgraphSchemaResponse, ForceCheckSuccessRequest, ForceCheckSuccessResponse, GenerateRouterTokenRequest, GenerateRouterTokenResponse, GetAllOverridesRequest, GetAllOverridesResponse, GetAnalyticsViewRequest, GetAnalyticsViewResponse, GetAPIKeysRequest, GetAPIKeysResponse, GetAuditLogsRequest, GetAuditLogsResponse, GetBillingPlansRequest, GetBillingPlansResponse, GetCacheWarmerConfigRequest, GetCacheWarmerConfigResponse, GetCacheWarmerOperationsRequest, GetCacheWarmerOperationsResponse, GetChangelogBySchemaVersionRequest, GetChangelogBySchemaVersionResponse, GetCheckOperationsRequest, GetCheckOperationsResponse, GetChecksByFederatedGraphNameRequest, GetChecksByFederatedGraphNameResponse, GetCheckSummaryRequest, GetCheckSummaryResponse, GetClientsFromAnalyticsRequest, GetClientsFromAnalyticsResponse, GetClientsRequest, GetClientsResponse, GetCompositionDetailsRequest, GetCompositionDetailsResponse, GetCompositionsRequest, GetCompositionsResponse, GetDashboardAnalyticsViewRequest, GetDashboardAnalyticsViewResponse, GetFeatureFlagByNameRequest, GetFeatureFlagByNameResponse, GetFeatureFlagsByFederatedGraphRequest, GetFeatureFlagsByFederatedGraphResponse, GetFeatureFlagsInLatestCompositionByFederatedGraphRequest, GetFeatureFlagsInLatestCompositionByFederatedGraphResponse, GetFeatureFlagsRequest, GetFeatureFlagsResponse, GetFeatureSubgraphsByFeatureFlagRequest, GetFeatureSubgraphsByFeatureFlagResponse, GetFeatureSubgraphsByFederatedGraphRequest, GetFeatureSubgraphsByFederatedGraphResponse, GetFeatureSubgraphsRequest, GetFeatureSubgraphsResponse, GetFederatedGraphByIdRequest, GetFederatedGraphByIdResponse, GetFederatedGraphByNameRequest, GetFederatedGraphByNameResponse, GetFederatedGraphChangelogRequest, GetFederatedGraphChangelogResponse, GetFederatedGraphsBySubgraphLabelsRequest, GetFederatedGraphsBySubgraphLabelsResponse, GetFederatedGraphSDLByNameRequest, GetFederatedGraphSDLByNameResponse, GetFederatedGraphsRequest, GetFederatedGraphsResponse, GetFieldUsageRequest, GetFieldUsageResponse, GetGraphMetricsRequest, GetGraphMetricsResponse, GetInvitationsRequest, GetInvitationsResponse, GetLatestSubgraphSDLRequest, GetLatestSubgraphSDLResponse, GetMetricsErrorRateRequest, GetMetricsErrorRateResponse, GetNamespaceChecksConfigurationRequest, GetNamespaceChecksConfigurationResponse, GetNamespaceGraphPruningConfigRequest, GetNamespaceGraphPruningConfigResponse, GetNamespaceLintConfigRequest, GetNamespaceLintConfigResponse, GetNamespaceProposalConfigRequest, GetNamespaceProposalConfigResponse, GetNamespaceRequest, GetNamespaceResponse, GetNamespacesRequest, GetNamespacesResponse, GetOIDCProviderRequest, GetOIDCProviderResponse, GetOnboardingRequest, GetOnboardingResponse, GetOperationClientsRequest, GetOperationClientsResponse, GetOperationContentRequest, GetOperationContentResponse, GetOperationDeprecatedFieldsRequest, GetOperationDeprecatedFieldsResponse, GetOperationOverridesRequest, GetOperationOverridesResponse, GetOperationsRequest, GetOperationsResponse, GetOrganizationBySlugRequest, GetOrganizationBySlugResponse, GetOrganizationGroupMembersRequest, GetOrganizationGroupMembersResponse, GetOrganizationGroupsRequest, GetOrganizationGroupsResponse, GetOrganizationIntegrationsRequest, GetOrganizationIntegrationsResponse, GetOrganizationMembersRequest, GetOrganizationMembersResponse, GetOrganizationRequestsCountRequest, GetOrganizationRequestsCountResponse, GetOrganizationWebhookConfigsRequest, GetOrganizationWebhookConfigsResponse, GetOrganizationWebhookHistoryRequest, GetOrganizationWebhookHistoryResponse, GetOrganizationWebhookMetaRequest, GetOrganizationWebhookMetaResponse, GetPendingOrganizationMembersRequest, GetPendingOrganizationMembersResponse, GetPersistedOperationsRequest, GetPersistedOperationsResponse, GetPlaygroundScriptsRequest, GetPlaygroundScriptsResponse, GetProposalChecksRequest, GetProposalChecksResponse, GetProposalRequest, GetProposalResponse, GetProposalsByFederatedGraphRequest, GetProposalsByFederatedGraphResponse, GetProposedSchemaOfCheckedSubgraphRequest, GetProposedSchemaOfCheckedSubgraphResponse, GetRoutersRequest, GetRoutersResponse, GetRouterTokensRequest, GetRouterTokensResponse, GetSdlBySchemaVersionRequest, GetSdlBySchemaVersionResponse, GetSubgraphByIdRequest, GetSubgraphByIdResponse, GetSubgraphByNameRequest, GetSubgraphByNameResponse, GetSubgraphCheckExtensionsConfigRequest, GetSubgraphCheckExtensionsConfigResponse, GetSubgraphMembersRequest, GetSubgraphMembersResponse, GetSubgraphMetricsErrorRateRequest, GetSubgraphMetricsErrorRateResponse, GetSubgraphMetricsRequest, GetSubgraphMetricsResponse, GetSubgraphSDLFromLatestCompositionRequest, GetSubgraphSDLFromLatestCompositionResponse, GetSubgraphsRequest, GetSubgraphsResponse, GetTraceRequest, GetTraceResponse, GetUserAccessiblePermissionsRequest, GetUserAccessiblePermissionsResponse, GetUserAccessibleResourcesRequest, GetUserAccessibleResourcesResponse, GetWebhookDeliveryDetailsRequest, GetWebhookDeliveryDetailsResponse, GetWorkspaceRequest, GetWorkspaceResponse, InitializeCosmoUserRequest, InitializeCosmoUserResponse, InviteUserRequest, InviteUserResponse, InviteUsersRequest, InviteUsersResponse, IsGitHubAppInstalledRequest, IsGitHubAppInstalledResponse, IsMemberLimitReachedRequest, IsMemberLimitReachedResponse, LeaveOrganizationRequest, LeaveOrganizationResponse, LinkSubgraphRequest, LinkSubgraphResponse, ListOrganizationsRequest, ListOrganizationsResponse, ListRouterCompatibilityVersionsRequest, ListRouterCompatibilityVersionsResponse, MigrateFromApolloRequest, MigrateFromApolloResponse, MigrateMonographRequest, MigrateMonographResponse, MoveGraphRequest, MoveGraphResponse, PublishFederatedSubgraphRequest, PublishFederatedSubgraphResponse, PublishMonographRequest, PublishMonographResponse, PublishPersistedOperationsRequest, PublishPersistedOperationsResponse, PushCacheWarmerOperationRequest, PushCacheWarmerOperationResponse, RecomposeGraphRequest, RecomposeGraphResponse, RedeliverWebhookRequest, RedeliverWebhookResponse, RemoveInvitationRequest, RemoveInvitationResponse, RemoveOperationIgnoreAllOverrideRequest, RemoveOperationIgnoreAllOverrideResponse, RemoveOperationOverridesRequest, RemoveOperationOverridesResponse, RemoveOrganizationMemberRequest, RemoveOrganizationMemberResponse, RenameNamespaceRequest, RenameNamespaceResponse, RestoreOrganizationRequest, RestoreOrganizationResponse, SetGraphRouterCompatibilityVersionRequest, SetGraphRouterCompatibilityVersionResponse, ToggleChangeOverridesForAllOperationsRequest, ToggleChangeOverridesForAllOperationsResponse, UnlinkSubgraphRequest, UnlinkSubgraphResponse, UpdateAPIKeyRequest, UpdateAPIKeyResponse, UpdateContractRequest, UpdateContractResponse, UpdateFeatureFlagRequest, UpdateFeatureFlagResponse, UpdateFeatureSettingsRequest, UpdateFeatureSettingsResponse, UpdateFederatedGraphRequest, UpdateFederatedGraphResponse, UpdateIDPMappersRequest, UpdateIDPMappersResponse, UpdateIntegrationConfigRequest, UpdateIntegrationConfigResponse, UpdateMonographRequest, UpdateMonographResponse, UpdateNamespaceChecksConfigurationRequest, UpdateNamespaceChecksConfigurationResponse, UpdateOrganizationDetailsRequest, UpdateOrganizationDetailsResponse, UpdateOrganizationGroupRequest, UpdateOrganizationGroupResponse, UpdateOrganizationWebhookConfigRequest, UpdateOrganizationWebhookConfigResponse, UpdateOrgMemberGroupRequest, UpdateOrgMemberGroupResponse, UpdatePlaygroundScriptRequest, UpdatePlaygroundScriptResponse, UpdateProposalRequest, UpdateProposalResponse, UpdateSubgraphRequest, UpdateSubgraphResponse, UpgradePlanRequest, UpgradePlanResponse, ValidateAndFetchPluginDataRequest, ValidateAndFetchPluginDataResponse, VerifyAPIKeyGraphAccessRequest, VerifyAPIKeyGraphAccessResponse, WhoAmIRequest, WhoAmIResponse } from "./platform_pb.js"; +import { AcceptOrDeclineInvitationRequest, AcceptOrDeclineInvitationResponse, AddReadmeRequest, AddReadmeResponse, CheckFederatedGraphRequest, CheckFederatedGraphResponse, CheckPersistedOperationTrafficRequest, CheckPersistedOperationTrafficResponse, CheckSubgraphSchemaRequest, CheckSubgraphSchemaResponse, ComputeCacheWarmerOperationsRequest, ComputeCacheWarmerOperationsResponse, ConfigureCacheWarmerRequest, ConfigureCacheWarmerResponse, ConfigureNamespaceGraphPruningConfigRequest, ConfigureNamespaceGraphPruningConfigResponse, ConfigureNamespaceLintConfigRequest, ConfigureNamespaceLintConfigResponse, ConfigureNamespaceProposalConfigRequest, ConfigureNamespaceProposalConfigResponse, ConfigureSubgraphCheckExtensionsRequest, ConfigureSubgraphCheckExtensionsResponse, CreateAPIKeyRequest, CreateAPIKeyResponse, CreateBillingPortalSessionRequest, CreateBillingPortalSessionResponse, CreateCheckoutSessionRequest, CreateCheckoutSessionResponse, CreateContractRequest, CreateContractResponse, CreateFeatureFlagRequest, CreateFeatureFlagResponse, CreateFederatedGraphRequest, CreateFederatedGraphResponse, CreateFederatedGraphTokenRequest, CreateFederatedGraphTokenResponse, CreateFederatedSubgraphRequest, CreateFederatedSubgraphResponse, CreateIgnoreOverridesForAllOperationsRequest, CreateIgnoreOverridesForAllOperationsResponse, CreateIntegrationRequest, CreateIntegrationResponse, CreateMonographRequest, CreateMonographResponse, CreateNamespaceRequest, CreateNamespaceResponse, CreateOIDCProviderRequest, CreateOIDCProviderResponse, CreateOnboardingRequest, CreateOnboardingResponse, CreateOperationIgnoreAllOverrideRequest, CreateOperationIgnoreAllOverrideResponse, CreateOperationOverridesRequest, CreateOperationOverridesResponse, CreateOrganizationGroupRequest, CreateOrganizationGroupResponse, CreateOrganizationRequest, CreateOrganizationResponse, CreateOrganizationWebhookConfigRequest, CreateOrganizationWebhookConfigResponse, CreatePlaygroundScriptRequest, CreatePlaygroundScriptResponse, CreateProposalRequest, CreateProposalResponse, DeleteAPIKeyRequest, DeleteAPIKeyResponse, DeleteCacheWarmerOperationRequest, DeleteCacheWarmerOperationResponse, DeleteFeatureFlagRequest, DeleteFeatureFlagResponse, DeleteFederatedGraphRequest, DeleteFederatedGraphResponse, DeleteFederatedSubgraphRequest, DeleteFederatedSubgraphResponse, DeleteIntegrationRequest, DeleteIntegrationResponse, DeleteMonographRequest, DeleteMonographResponse, DeleteNamespaceRequest, DeleteNamespaceResponse, DeleteOIDCProviderRequest, DeleteOIDCProviderResponse, DeleteOrganizationGroupRequest, DeleteOrganizationGroupResponse, DeleteOrganizationRequest, DeleteOrganizationResponse, DeleteOrganizationWebhookConfigRequest, DeleteOrganizationWebhookConfigResponse, DeletePersistedOperationRequest, DeletePersistedOperationResponse, DeletePlaygroundScriptRequest, DeletePlaygroundScriptResponse, DeleteRouterTokenRequest, DeleteRouterTokenResponse, DeleteUserRequest, DeleteUserResponse, EnableFeatureFlagRequest, EnableFeatureFlagResponse, EnableGraphPruningRequest, EnableGraphPruningResponse, EnableLintingForTheNamespaceRequest, EnableLintingForTheNamespaceResponse, EnableProposalsForNamespaceRequest, EnableProposalsForNamespaceResponse, FinishOnboardingRequest, FinishOnboardingResponse, FixSubgraphSchemaRequest, FixSubgraphSchemaResponse, ForceCheckSuccessRequest, ForceCheckSuccessResponse, GenerateRouterTokenRequest, GenerateRouterTokenResponse, GetAllOverridesRequest, GetAllOverridesResponse, GetAnalyticsViewRequest, GetAnalyticsViewResponse, GetAPIKeysRequest, GetAPIKeysResponse, GetAuditLogsRequest, GetAuditLogsResponse, GetBillingPlansRequest, GetBillingPlansResponse, GetCacheWarmerConfigRequest, GetCacheWarmerConfigResponse, GetCacheWarmerOperationsRequest, GetCacheWarmerOperationsResponse, GetChangelogBySchemaVersionRequest, GetChangelogBySchemaVersionResponse, GetCheckOperationsRequest, GetCheckOperationsResponse, GetChecksByFederatedGraphNameRequest, GetChecksByFederatedGraphNameResponse, GetCheckSummaryRequest, GetCheckSummaryResponse, GetClientsFromAnalyticsRequest, GetClientsFromAnalyticsResponse, GetClientsRequest, GetClientsResponse, GetCompositionDetailsRequest, GetCompositionDetailsResponse, GetCompositionsRequest, GetCompositionsResponse, GetDashboardAnalyticsViewRequest, GetDashboardAnalyticsViewResponse, GetFeatureFlagByNameRequest, GetFeatureFlagByNameResponse, GetFeatureFlagsByFederatedGraphRequest, GetFeatureFlagsByFederatedGraphResponse, GetFeatureFlagsInLatestCompositionByFederatedGraphRequest, GetFeatureFlagsInLatestCompositionByFederatedGraphResponse, GetFeatureFlagsRequest, GetFeatureFlagsResponse, GetFeatureSubgraphsByFeatureFlagRequest, GetFeatureSubgraphsByFeatureFlagResponse, GetFeatureSubgraphsByFederatedGraphRequest, GetFeatureSubgraphsByFederatedGraphResponse, GetFeatureSubgraphsRequest, GetFeatureSubgraphsResponse, GetFederatedGraphByIdRequest, GetFederatedGraphByIdResponse, GetFederatedGraphByNameRequest, GetFederatedGraphByNameResponse, GetFederatedGraphChangelogRequest, GetFederatedGraphChangelogResponse, GetFederatedGraphsBySubgraphLabelsRequest, GetFederatedGraphsBySubgraphLabelsResponse, GetFederatedGraphSDLByNameRequest, GetFederatedGraphSDLByNameResponse, GetFederatedGraphsRequest, GetFederatedGraphsResponse, GetFieldUsageRequest, GetFieldUsageResponse, GetGraphMetricsRequest, GetGraphMetricsResponse, GetInvitationsRequest, GetInvitationsResponse, GetLatestSubgraphSDLRequest, GetLatestSubgraphSDLResponse, GetMetricsErrorRateRequest, GetMetricsErrorRateResponse, GetNamespaceChecksConfigurationRequest, GetNamespaceChecksConfigurationResponse, GetNamespaceGraphPruningConfigRequest, GetNamespaceGraphPruningConfigResponse, GetNamespaceLintConfigRequest, GetNamespaceLintConfigResponse, GetNamespaceProposalConfigRequest, GetNamespaceProposalConfigResponse, GetNamespaceRequest, GetNamespaceResponse, GetNamespacesRequest, GetNamespacesResponse, GetOIDCProviderRequest, GetOIDCProviderResponse, GetOnboardingRequest, GetOnboardingResponse, GetOperationClientsRequest, GetOperationClientsResponse, GetOperationContentRequest, GetOperationContentResponse, GetOperationDeprecatedFieldsRequest, GetOperationDeprecatedFieldsResponse, GetOperationOverridesRequest, GetOperationOverridesResponse, GetOperationsRequest, GetOperationsResponse, GetOrganizationBySlugRequest, GetOrganizationBySlugResponse, GetOrganizationGroupMembersRequest, GetOrganizationGroupMembersResponse, GetOrganizationGroupsRequest, GetOrganizationGroupsResponse, GetOrganizationIntegrationsRequest, GetOrganizationIntegrationsResponse, GetOrganizationMembersRequest, GetOrganizationMembersResponse, GetOrganizationRequestsCountRequest, GetOrganizationRequestsCountResponse, GetOrganizationWebhookConfigsRequest, GetOrganizationWebhookConfigsResponse, GetOrganizationWebhookHistoryRequest, GetOrganizationWebhookHistoryResponse, GetOrganizationWebhookMetaRequest, GetOrganizationWebhookMetaResponse, GetPendingOrganizationMembersRequest, GetPendingOrganizationMembersResponse, GetPersistedOperationsRequest, GetPersistedOperationsResponse, GetPlaygroundScriptsRequest, GetPlaygroundScriptsResponse, GetProposalChecksRequest, GetProposalChecksResponse, GetProposalRequest, GetProposalResponse, GetProposalsByFederatedGraphRequest, GetProposalsByFederatedGraphResponse, GetProposedSchemaOfCheckedSubgraphRequest, GetProposedSchemaOfCheckedSubgraphResponse, GetRoutersRequest, GetRoutersResponse, GetRouterTokensRequest, GetRouterTokensResponse, GetSdlBySchemaVersionRequest, GetSdlBySchemaVersionResponse, GetSubgraphByIdRequest, GetSubgraphByIdResponse, GetSubgraphByNameRequest, GetSubgraphByNameResponse, GetSubgraphCheckExtensionsConfigRequest, GetSubgraphCheckExtensionsConfigResponse, GetSubgraphMembersRequest, GetSubgraphMembersResponse, GetSubgraphMetricsErrorRateRequest, GetSubgraphMetricsErrorRateResponse, GetSubgraphMetricsRequest, GetSubgraphMetricsResponse, GetSubgraphSDLFromLatestCompositionRequest, GetSubgraphSDLFromLatestCompositionResponse, GetSubgraphsRequest, GetSubgraphsResponse, GetTraceRequest, GetTraceResponse, GetUserAccessiblePermissionsRequest, GetUserAccessiblePermissionsResponse, GetUserAccessibleResourcesRequest, GetUserAccessibleResourcesResponse, GetWebhookDeliveryDetailsRequest, GetWebhookDeliveryDetailsResponse, GetWorkspaceRequest, GetWorkspaceResponse, InitializeCosmoUserRequest, InitializeCosmoUserResponse, InviteUserRequest, InviteUserResponse, InviteUsersRequest, InviteUsersResponse, IsGitHubAppInstalledRequest, IsGitHubAppInstalledResponse, IsMemberLimitReachedRequest, IsMemberLimitReachedResponse, LeaveOrganizationRequest, LeaveOrganizationResponse, LinkSubgraphRequest, LinkSubgraphResponse, ListOrganizationsRequest, ListOrganizationsResponse, ListRouterCompatibilityVersionsRequest, ListRouterCompatibilityVersionsResponse, MigrateFromApolloRequest, MigrateFromApolloResponse, MigrateMonographRequest, MigrateMonographResponse, MoveGraphRequest, MoveGraphResponse, PublishFederatedSubgraphRequest, PublishFederatedSubgraphResponse, PublishMonographRequest, PublishMonographResponse, PublishPersistedOperationsRequest, PublishPersistedOperationsResponse, PushCacheWarmerOperationRequest, PushCacheWarmerOperationResponse, RecomposeFeatureFlagRequest, RecomposeFeatureFlagResponse, RecomposeGraphRequest, RecomposeGraphResponse, RedeliverWebhookRequest, RedeliverWebhookResponse, RemoveInvitationRequest, RemoveInvitationResponse, RemoveOperationIgnoreAllOverrideRequest, RemoveOperationIgnoreAllOverrideResponse, RemoveOperationOverridesRequest, RemoveOperationOverridesResponse, RemoveOrganizationMemberRequest, RemoveOrganizationMemberResponse, RenameNamespaceRequest, RenameNamespaceResponse, RestoreOrganizationRequest, RestoreOrganizationResponse, SetGraphRouterCompatibilityVersionRequest, SetGraphRouterCompatibilityVersionResponse, ToggleChangeOverridesForAllOperationsRequest, ToggleChangeOverridesForAllOperationsResponse, UnlinkSubgraphRequest, UnlinkSubgraphResponse, UpdateAPIKeyRequest, UpdateAPIKeyResponse, UpdateContractRequest, UpdateContractResponse, UpdateFeatureFlagRequest, UpdateFeatureFlagResponse, UpdateFeatureSettingsRequest, UpdateFeatureSettingsResponse, UpdateFederatedGraphRequest, UpdateFederatedGraphResponse, UpdateIDPMappersRequest, UpdateIDPMappersResponse, UpdateIntegrationConfigRequest, UpdateIntegrationConfigResponse, UpdateMonographRequest, UpdateMonographResponse, UpdateNamespaceChecksConfigurationRequest, UpdateNamespaceChecksConfigurationResponse, UpdateOrganizationDetailsRequest, UpdateOrganizationDetailsResponse, UpdateOrganizationGroupRequest, UpdateOrganizationGroupResponse, UpdateOrganizationWebhookConfigRequest, UpdateOrganizationWebhookConfigResponse, UpdateOrgMemberGroupRequest, UpdateOrgMemberGroupResponse, UpdatePlaygroundScriptRequest, UpdatePlaygroundScriptResponse, UpdateProposalRequest, UpdateProposalResponse, UpdateSubgraphRequest, UpdateSubgraphResponse, UpgradePlanRequest, UpgradePlanResponse, ValidateAndFetchPluginDataRequest, ValidateAndFetchPluginDataResponse, VerifyAPIKeyGraphAccessRequest, VerifyAPIKeyGraphAccessResponse, WhoAmIRequest, WhoAmIResponse } from "./platform_pb.js"; /** * PlaygroundScripts @@ -2868,6 +2868,22 @@ export const recomposeGraph = { } } as const; +/** + * RecomposeFeatureFlag triggers a recomposition of the feature flag using its current subgraphs + * + * @generated from rpc wg.cosmo.platform.v1.PlatformService.RecomposeFeatureFlag + */ +export const recomposeFeatureFlag = { + localName: "recomposeFeatureFlag", + name: "RecomposeFeatureFlag", + kind: MethodKind.Unary, + I: RecomposeFeatureFlagRequest, + O: RecomposeFeatureFlagResponse, + service: { + typeName: "wg.cosmo.platform.v1.PlatformService" + } +} as const; + /** * Onboarding * diff --git a/connect/src/wg/cosmo/platform/v1/platform_connect.ts b/connect/src/wg/cosmo/platform/v1/platform_connect.ts index 5fc1bac940..6b120ad8aa 100644 --- a/connect/src/wg/cosmo/platform/v1/platform_connect.ts +++ b/connect/src/wg/cosmo/platform/v1/platform_connect.ts @@ -5,7 +5,7 @@ /* eslint-disable */ // @ts-nocheck -import { AcceptOrDeclineInvitationRequest, AcceptOrDeclineInvitationResponse, AddReadmeRequest, AddReadmeResponse, CheckFederatedGraphRequest, CheckFederatedGraphResponse, CheckPersistedOperationTrafficRequest, CheckPersistedOperationTrafficResponse, CheckSubgraphSchemaRequest, CheckSubgraphSchemaResponse, ComputeCacheWarmerOperationsRequest, ComputeCacheWarmerOperationsResponse, ConfigureCacheWarmerRequest, ConfigureCacheWarmerResponse, ConfigureNamespaceGraphPruningConfigRequest, ConfigureNamespaceGraphPruningConfigResponse, ConfigureNamespaceLintConfigRequest, ConfigureNamespaceLintConfigResponse, ConfigureNamespaceProposalConfigRequest, ConfigureNamespaceProposalConfigResponse, ConfigureSubgraphCheckExtensionsRequest, ConfigureSubgraphCheckExtensionsResponse, CreateAPIKeyRequest, CreateAPIKeyResponse, CreateBillingPortalSessionRequest, CreateBillingPortalSessionResponse, CreateCheckoutSessionRequest, CreateCheckoutSessionResponse, CreateContractRequest, CreateContractResponse, CreateFeatureFlagRequest, CreateFeatureFlagResponse, CreateFederatedGraphRequest, CreateFederatedGraphResponse, CreateFederatedGraphTokenRequest, CreateFederatedGraphTokenResponse, CreateFederatedSubgraphRequest, CreateFederatedSubgraphResponse, CreateIgnoreOverridesForAllOperationsRequest, CreateIgnoreOverridesForAllOperationsResponse, CreateIntegrationRequest, CreateIntegrationResponse, CreateMonographRequest, CreateMonographResponse, CreateNamespaceRequest, CreateNamespaceResponse, CreateOIDCProviderRequest, CreateOIDCProviderResponse, CreateOnboardingRequest, CreateOnboardingResponse, CreateOperationIgnoreAllOverrideRequest, CreateOperationIgnoreAllOverrideResponse, CreateOperationOverridesRequest, CreateOperationOverridesResponse, CreateOrganizationGroupRequest, CreateOrganizationGroupResponse, CreateOrganizationRequest, CreateOrganizationResponse, CreateOrganizationWebhookConfigRequest, CreateOrganizationWebhookConfigResponse, CreatePlaygroundScriptRequest, CreatePlaygroundScriptResponse, CreateProposalRequest, CreateProposalResponse, DeleteAPIKeyRequest, DeleteAPIKeyResponse, DeleteCacheWarmerOperationRequest, DeleteCacheWarmerOperationResponse, DeleteFeatureFlagRequest, DeleteFeatureFlagResponse, DeleteFederatedGraphRequest, DeleteFederatedGraphResponse, DeleteFederatedSubgraphRequest, DeleteFederatedSubgraphResponse, DeleteIntegrationRequest, DeleteIntegrationResponse, DeleteMonographRequest, DeleteMonographResponse, DeleteNamespaceRequest, DeleteNamespaceResponse, DeleteOIDCProviderRequest, DeleteOIDCProviderResponse, DeleteOrganizationGroupRequest, DeleteOrganizationGroupResponse, DeleteOrganizationRequest, DeleteOrganizationResponse, DeleteOrganizationWebhookConfigRequest, DeleteOrganizationWebhookConfigResponse, DeletePersistedOperationRequest, DeletePersistedOperationResponse, DeletePlaygroundScriptRequest, DeletePlaygroundScriptResponse, DeleteRouterTokenRequest, DeleteRouterTokenResponse, DeleteUserRequest, DeleteUserResponse, EnableFeatureFlagRequest, EnableFeatureFlagResponse, EnableGraphPruningRequest, EnableGraphPruningResponse, EnableLintingForTheNamespaceRequest, EnableLintingForTheNamespaceResponse, EnableProposalsForNamespaceRequest, EnableProposalsForNamespaceResponse, FinishOnboardingRequest, FinishOnboardingResponse, FixSubgraphSchemaRequest, FixSubgraphSchemaResponse, ForceCheckSuccessRequest, ForceCheckSuccessResponse, GenerateRouterTokenRequest, GenerateRouterTokenResponse, GetAllOverridesRequest, GetAllOverridesResponse, GetAnalyticsViewRequest, GetAnalyticsViewResponse, GetAPIKeysRequest, GetAPIKeysResponse, GetAuditLogsRequest, GetAuditLogsResponse, GetBillingPlansRequest, GetBillingPlansResponse, GetCacheWarmerConfigRequest, GetCacheWarmerConfigResponse, GetCacheWarmerOperationsRequest, GetCacheWarmerOperationsResponse, GetChangelogBySchemaVersionRequest, GetChangelogBySchemaVersionResponse, GetCheckOperationsRequest, GetCheckOperationsResponse, GetChecksByFederatedGraphNameRequest, GetChecksByFederatedGraphNameResponse, GetCheckSummaryRequest, GetCheckSummaryResponse, GetClientsFromAnalyticsRequest, GetClientsFromAnalyticsResponse, GetClientsRequest, GetClientsResponse, GetCompositionDetailsRequest, GetCompositionDetailsResponse, GetCompositionsRequest, GetCompositionsResponse, GetDashboardAnalyticsViewRequest, GetDashboardAnalyticsViewResponse, GetFeatureFlagByNameRequest, GetFeatureFlagByNameResponse, GetFeatureFlagsByFederatedGraphRequest, GetFeatureFlagsByFederatedGraphResponse, GetFeatureFlagsInLatestCompositionByFederatedGraphRequest, GetFeatureFlagsInLatestCompositionByFederatedGraphResponse, GetFeatureFlagsRequest, GetFeatureFlagsResponse, GetFeatureSubgraphsByFeatureFlagRequest, GetFeatureSubgraphsByFeatureFlagResponse, GetFeatureSubgraphsByFederatedGraphRequest, GetFeatureSubgraphsByFederatedGraphResponse, GetFeatureSubgraphsRequest, GetFeatureSubgraphsResponse, GetFederatedGraphByIdRequest, GetFederatedGraphByIdResponse, GetFederatedGraphByNameRequest, GetFederatedGraphByNameResponse, GetFederatedGraphChangelogRequest, GetFederatedGraphChangelogResponse, GetFederatedGraphsBySubgraphLabelsRequest, GetFederatedGraphsBySubgraphLabelsResponse, GetFederatedGraphSDLByNameRequest, GetFederatedGraphSDLByNameResponse, GetFederatedGraphsRequest, GetFederatedGraphsResponse, GetFieldUsageRequest, GetFieldUsageResponse, GetGraphMetricsRequest, GetGraphMetricsResponse, GetInvitationsRequest, GetInvitationsResponse, GetLatestSubgraphSDLRequest, GetLatestSubgraphSDLResponse, GetMetricsErrorRateRequest, GetMetricsErrorRateResponse, GetNamespaceChecksConfigurationRequest, GetNamespaceChecksConfigurationResponse, GetNamespaceGraphPruningConfigRequest, GetNamespaceGraphPruningConfigResponse, GetNamespaceLintConfigRequest, GetNamespaceLintConfigResponse, GetNamespaceProposalConfigRequest, GetNamespaceProposalConfigResponse, GetNamespaceRequest, GetNamespaceResponse, GetNamespacesRequest, GetNamespacesResponse, GetOIDCProviderRequest, GetOIDCProviderResponse, GetOnboardingRequest, GetOnboardingResponse, GetOperationClientsRequest, GetOperationClientsResponse, GetOperationContentRequest, GetOperationContentResponse, GetOperationDeprecatedFieldsRequest, GetOperationDeprecatedFieldsResponse, GetOperationOverridesRequest, GetOperationOverridesResponse, GetOperationsRequest, GetOperationsResponse, GetOrganizationBySlugRequest, GetOrganizationBySlugResponse, GetOrganizationGroupMembersRequest, GetOrganizationGroupMembersResponse, GetOrganizationGroupsRequest, GetOrganizationGroupsResponse, GetOrganizationIntegrationsRequest, GetOrganizationIntegrationsResponse, GetOrganizationMembersRequest, GetOrganizationMembersResponse, GetOrganizationRequestsCountRequest, GetOrganizationRequestsCountResponse, GetOrganizationWebhookConfigsRequest, GetOrganizationWebhookConfigsResponse, GetOrganizationWebhookHistoryRequest, GetOrganizationWebhookHistoryResponse, GetOrganizationWebhookMetaRequest, GetOrganizationWebhookMetaResponse, GetPendingOrganizationMembersRequest, GetPendingOrganizationMembersResponse, GetPersistedOperationsRequest, GetPersistedOperationsResponse, GetPlaygroundScriptsRequest, GetPlaygroundScriptsResponse, GetProposalChecksRequest, GetProposalChecksResponse, GetProposalRequest, GetProposalResponse, GetProposalsByFederatedGraphRequest, GetProposalsByFederatedGraphResponse, GetProposedSchemaOfCheckedSubgraphRequest, GetProposedSchemaOfCheckedSubgraphResponse, GetRoutersRequest, GetRoutersResponse, GetRouterTokensRequest, GetRouterTokensResponse, GetSdlBySchemaVersionRequest, GetSdlBySchemaVersionResponse, GetSubgraphByIdRequest, GetSubgraphByIdResponse, GetSubgraphByNameRequest, GetSubgraphByNameResponse, GetSubgraphCheckExtensionsConfigRequest, GetSubgraphCheckExtensionsConfigResponse, GetSubgraphMembersRequest, GetSubgraphMembersResponse, GetSubgraphMetricsErrorRateRequest, GetSubgraphMetricsErrorRateResponse, GetSubgraphMetricsRequest, GetSubgraphMetricsResponse, GetSubgraphSDLFromLatestCompositionRequest, GetSubgraphSDLFromLatestCompositionResponse, GetSubgraphsRequest, GetSubgraphsResponse, GetTraceRequest, GetTraceResponse, GetUserAccessiblePermissionsRequest, GetUserAccessiblePermissionsResponse, GetUserAccessibleResourcesRequest, GetUserAccessibleResourcesResponse, GetWebhookDeliveryDetailsRequest, GetWebhookDeliveryDetailsResponse, GetWorkspaceRequest, GetWorkspaceResponse, InitializeCosmoUserRequest, InitializeCosmoUserResponse, InviteUserRequest, InviteUserResponse, InviteUsersRequest, InviteUsersResponse, IsGitHubAppInstalledRequest, IsGitHubAppInstalledResponse, IsMemberLimitReachedRequest, IsMemberLimitReachedResponse, LeaveOrganizationRequest, LeaveOrganizationResponse, LinkSubgraphRequest, LinkSubgraphResponse, ListOrganizationsRequest, ListOrganizationsResponse, ListRouterCompatibilityVersionsRequest, ListRouterCompatibilityVersionsResponse, MigrateFromApolloRequest, MigrateFromApolloResponse, MigrateMonographRequest, MigrateMonographResponse, MoveGraphRequest, MoveGraphResponse, PublishFederatedSubgraphRequest, PublishFederatedSubgraphResponse, PublishMonographRequest, PublishMonographResponse, PublishPersistedOperationsRequest, PublishPersistedOperationsResponse, PushCacheWarmerOperationRequest, PushCacheWarmerOperationResponse, RecomposeGraphRequest, RecomposeGraphResponse, RedeliverWebhookRequest, RedeliverWebhookResponse, RemoveInvitationRequest, RemoveInvitationResponse, RemoveOperationIgnoreAllOverrideRequest, RemoveOperationIgnoreAllOverrideResponse, RemoveOperationOverridesRequest, RemoveOperationOverridesResponse, RemoveOrganizationMemberRequest, RemoveOrganizationMemberResponse, RenameNamespaceRequest, RenameNamespaceResponse, RestoreOrganizationRequest, RestoreOrganizationResponse, SetGraphRouterCompatibilityVersionRequest, SetGraphRouterCompatibilityVersionResponse, ToggleChangeOverridesForAllOperationsRequest, ToggleChangeOverridesForAllOperationsResponse, UnlinkSubgraphRequest, UnlinkSubgraphResponse, UpdateAPIKeyRequest, UpdateAPIKeyResponse, UpdateContractRequest, UpdateContractResponse, UpdateFeatureFlagRequest, UpdateFeatureFlagResponse, UpdateFeatureSettingsRequest, UpdateFeatureSettingsResponse, UpdateFederatedGraphRequest, UpdateFederatedGraphResponse, UpdateIDPMappersRequest, UpdateIDPMappersResponse, UpdateIntegrationConfigRequest, UpdateIntegrationConfigResponse, UpdateMonographRequest, UpdateMonographResponse, UpdateNamespaceChecksConfigurationRequest, UpdateNamespaceChecksConfigurationResponse, UpdateOrganizationDetailsRequest, UpdateOrganizationDetailsResponse, UpdateOrganizationGroupRequest, UpdateOrganizationGroupResponse, UpdateOrganizationWebhookConfigRequest, UpdateOrganizationWebhookConfigResponse, UpdateOrgMemberGroupRequest, UpdateOrgMemberGroupResponse, UpdatePlaygroundScriptRequest, UpdatePlaygroundScriptResponse, UpdateProposalRequest, UpdateProposalResponse, UpdateSubgraphRequest, UpdateSubgraphResponse, UpgradePlanRequest, UpgradePlanResponse, ValidateAndFetchPluginDataRequest, ValidateAndFetchPluginDataResponse, VerifyAPIKeyGraphAccessRequest, VerifyAPIKeyGraphAccessResponse, WhoAmIRequest, WhoAmIResponse } from "./platform_pb.js"; +import { AcceptOrDeclineInvitationRequest, AcceptOrDeclineInvitationResponse, AddReadmeRequest, AddReadmeResponse, CheckFederatedGraphRequest, CheckFederatedGraphResponse, CheckPersistedOperationTrafficRequest, CheckPersistedOperationTrafficResponse, CheckSubgraphSchemaRequest, CheckSubgraphSchemaResponse, ComputeCacheWarmerOperationsRequest, ComputeCacheWarmerOperationsResponse, ConfigureCacheWarmerRequest, ConfigureCacheWarmerResponse, ConfigureNamespaceGraphPruningConfigRequest, ConfigureNamespaceGraphPruningConfigResponse, ConfigureNamespaceLintConfigRequest, ConfigureNamespaceLintConfigResponse, ConfigureNamespaceProposalConfigRequest, ConfigureNamespaceProposalConfigResponse, ConfigureSubgraphCheckExtensionsRequest, ConfigureSubgraphCheckExtensionsResponse, CreateAPIKeyRequest, CreateAPIKeyResponse, CreateBillingPortalSessionRequest, CreateBillingPortalSessionResponse, CreateCheckoutSessionRequest, CreateCheckoutSessionResponse, CreateContractRequest, CreateContractResponse, CreateFeatureFlagRequest, CreateFeatureFlagResponse, CreateFederatedGraphRequest, CreateFederatedGraphResponse, CreateFederatedGraphTokenRequest, CreateFederatedGraphTokenResponse, CreateFederatedSubgraphRequest, CreateFederatedSubgraphResponse, CreateIgnoreOverridesForAllOperationsRequest, CreateIgnoreOverridesForAllOperationsResponse, CreateIntegrationRequest, CreateIntegrationResponse, CreateMonographRequest, CreateMonographResponse, CreateNamespaceRequest, CreateNamespaceResponse, CreateOIDCProviderRequest, CreateOIDCProviderResponse, CreateOnboardingRequest, CreateOnboardingResponse, CreateOperationIgnoreAllOverrideRequest, CreateOperationIgnoreAllOverrideResponse, CreateOperationOverridesRequest, CreateOperationOverridesResponse, CreateOrganizationGroupRequest, CreateOrganizationGroupResponse, CreateOrganizationRequest, CreateOrganizationResponse, CreateOrganizationWebhookConfigRequest, CreateOrganizationWebhookConfigResponse, CreatePlaygroundScriptRequest, CreatePlaygroundScriptResponse, CreateProposalRequest, CreateProposalResponse, DeleteAPIKeyRequest, DeleteAPIKeyResponse, DeleteCacheWarmerOperationRequest, DeleteCacheWarmerOperationResponse, DeleteFeatureFlagRequest, DeleteFeatureFlagResponse, DeleteFederatedGraphRequest, DeleteFederatedGraphResponse, DeleteFederatedSubgraphRequest, DeleteFederatedSubgraphResponse, DeleteIntegrationRequest, DeleteIntegrationResponse, DeleteMonographRequest, DeleteMonographResponse, DeleteNamespaceRequest, DeleteNamespaceResponse, DeleteOIDCProviderRequest, DeleteOIDCProviderResponse, DeleteOrganizationGroupRequest, DeleteOrganizationGroupResponse, DeleteOrganizationRequest, DeleteOrganizationResponse, DeleteOrganizationWebhookConfigRequest, DeleteOrganizationWebhookConfigResponse, DeletePersistedOperationRequest, DeletePersistedOperationResponse, DeletePlaygroundScriptRequest, DeletePlaygroundScriptResponse, DeleteRouterTokenRequest, DeleteRouterTokenResponse, DeleteUserRequest, DeleteUserResponse, EnableFeatureFlagRequest, EnableFeatureFlagResponse, EnableGraphPruningRequest, EnableGraphPruningResponse, EnableLintingForTheNamespaceRequest, EnableLintingForTheNamespaceResponse, EnableProposalsForNamespaceRequest, EnableProposalsForNamespaceResponse, FinishOnboardingRequest, FinishOnboardingResponse, FixSubgraphSchemaRequest, FixSubgraphSchemaResponse, ForceCheckSuccessRequest, ForceCheckSuccessResponse, GenerateRouterTokenRequest, GenerateRouterTokenResponse, GetAllOverridesRequest, GetAllOverridesResponse, GetAnalyticsViewRequest, GetAnalyticsViewResponse, GetAPIKeysRequest, GetAPIKeysResponse, GetAuditLogsRequest, GetAuditLogsResponse, GetBillingPlansRequest, GetBillingPlansResponse, GetCacheWarmerConfigRequest, GetCacheWarmerConfigResponse, GetCacheWarmerOperationsRequest, GetCacheWarmerOperationsResponse, GetChangelogBySchemaVersionRequest, GetChangelogBySchemaVersionResponse, GetCheckOperationsRequest, GetCheckOperationsResponse, GetChecksByFederatedGraphNameRequest, GetChecksByFederatedGraphNameResponse, GetCheckSummaryRequest, GetCheckSummaryResponse, GetClientsFromAnalyticsRequest, GetClientsFromAnalyticsResponse, GetClientsRequest, GetClientsResponse, GetCompositionDetailsRequest, GetCompositionDetailsResponse, GetCompositionsRequest, GetCompositionsResponse, GetDashboardAnalyticsViewRequest, GetDashboardAnalyticsViewResponse, GetFeatureFlagByNameRequest, GetFeatureFlagByNameResponse, GetFeatureFlagsByFederatedGraphRequest, GetFeatureFlagsByFederatedGraphResponse, GetFeatureFlagsInLatestCompositionByFederatedGraphRequest, GetFeatureFlagsInLatestCompositionByFederatedGraphResponse, GetFeatureFlagsRequest, GetFeatureFlagsResponse, GetFeatureSubgraphsByFeatureFlagRequest, GetFeatureSubgraphsByFeatureFlagResponse, GetFeatureSubgraphsByFederatedGraphRequest, GetFeatureSubgraphsByFederatedGraphResponse, GetFeatureSubgraphsRequest, GetFeatureSubgraphsResponse, GetFederatedGraphByIdRequest, GetFederatedGraphByIdResponse, GetFederatedGraphByNameRequest, GetFederatedGraphByNameResponse, GetFederatedGraphChangelogRequest, GetFederatedGraphChangelogResponse, GetFederatedGraphsBySubgraphLabelsRequest, GetFederatedGraphsBySubgraphLabelsResponse, GetFederatedGraphSDLByNameRequest, GetFederatedGraphSDLByNameResponse, GetFederatedGraphsRequest, GetFederatedGraphsResponse, GetFieldUsageRequest, GetFieldUsageResponse, GetGraphMetricsRequest, GetGraphMetricsResponse, GetInvitationsRequest, GetInvitationsResponse, GetLatestSubgraphSDLRequest, GetLatestSubgraphSDLResponse, GetMetricsErrorRateRequest, GetMetricsErrorRateResponse, GetNamespaceChecksConfigurationRequest, GetNamespaceChecksConfigurationResponse, GetNamespaceGraphPruningConfigRequest, GetNamespaceGraphPruningConfigResponse, GetNamespaceLintConfigRequest, GetNamespaceLintConfigResponse, GetNamespaceProposalConfigRequest, GetNamespaceProposalConfigResponse, GetNamespaceRequest, GetNamespaceResponse, GetNamespacesRequest, GetNamespacesResponse, GetOIDCProviderRequest, GetOIDCProviderResponse, GetOnboardingRequest, GetOnboardingResponse, GetOperationClientsRequest, GetOperationClientsResponse, GetOperationContentRequest, GetOperationContentResponse, GetOperationDeprecatedFieldsRequest, GetOperationDeprecatedFieldsResponse, GetOperationOverridesRequest, GetOperationOverridesResponse, GetOperationsRequest, GetOperationsResponse, GetOrganizationBySlugRequest, GetOrganizationBySlugResponse, GetOrganizationGroupMembersRequest, GetOrganizationGroupMembersResponse, GetOrganizationGroupsRequest, GetOrganizationGroupsResponse, GetOrganizationIntegrationsRequest, GetOrganizationIntegrationsResponse, GetOrganizationMembersRequest, GetOrganizationMembersResponse, GetOrganizationRequestsCountRequest, GetOrganizationRequestsCountResponse, GetOrganizationWebhookConfigsRequest, GetOrganizationWebhookConfigsResponse, GetOrganizationWebhookHistoryRequest, GetOrganizationWebhookHistoryResponse, GetOrganizationWebhookMetaRequest, GetOrganizationWebhookMetaResponse, GetPendingOrganizationMembersRequest, GetPendingOrganizationMembersResponse, GetPersistedOperationsRequest, GetPersistedOperationsResponse, GetPlaygroundScriptsRequest, GetPlaygroundScriptsResponse, GetProposalChecksRequest, GetProposalChecksResponse, GetProposalRequest, GetProposalResponse, GetProposalsByFederatedGraphRequest, GetProposalsByFederatedGraphResponse, GetProposedSchemaOfCheckedSubgraphRequest, GetProposedSchemaOfCheckedSubgraphResponse, GetRoutersRequest, GetRoutersResponse, GetRouterTokensRequest, GetRouterTokensResponse, GetSdlBySchemaVersionRequest, GetSdlBySchemaVersionResponse, GetSubgraphByIdRequest, GetSubgraphByIdResponse, GetSubgraphByNameRequest, GetSubgraphByNameResponse, GetSubgraphCheckExtensionsConfigRequest, GetSubgraphCheckExtensionsConfigResponse, GetSubgraphMembersRequest, GetSubgraphMembersResponse, GetSubgraphMetricsErrorRateRequest, GetSubgraphMetricsErrorRateResponse, GetSubgraphMetricsRequest, GetSubgraphMetricsResponse, GetSubgraphSDLFromLatestCompositionRequest, GetSubgraphSDLFromLatestCompositionResponse, GetSubgraphsRequest, GetSubgraphsResponse, GetTraceRequest, GetTraceResponse, GetUserAccessiblePermissionsRequest, GetUserAccessiblePermissionsResponse, GetUserAccessibleResourcesRequest, GetUserAccessibleResourcesResponse, GetWebhookDeliveryDetailsRequest, GetWebhookDeliveryDetailsResponse, GetWorkspaceRequest, GetWorkspaceResponse, InitializeCosmoUserRequest, InitializeCosmoUserResponse, InviteUserRequest, InviteUserResponse, InviteUsersRequest, InviteUsersResponse, IsGitHubAppInstalledRequest, IsGitHubAppInstalledResponse, IsMemberLimitReachedRequest, IsMemberLimitReachedResponse, LeaveOrganizationRequest, LeaveOrganizationResponse, LinkSubgraphRequest, LinkSubgraphResponse, ListOrganizationsRequest, ListOrganizationsResponse, ListRouterCompatibilityVersionsRequest, ListRouterCompatibilityVersionsResponse, MigrateFromApolloRequest, MigrateFromApolloResponse, MigrateMonographRequest, MigrateMonographResponse, MoveGraphRequest, MoveGraphResponse, PublishFederatedSubgraphRequest, PublishFederatedSubgraphResponse, PublishMonographRequest, PublishMonographResponse, PublishPersistedOperationsRequest, PublishPersistedOperationsResponse, PushCacheWarmerOperationRequest, PushCacheWarmerOperationResponse, RecomposeFeatureFlagRequest, RecomposeFeatureFlagResponse, RecomposeGraphRequest, RecomposeGraphResponse, RedeliverWebhookRequest, RedeliverWebhookResponse, RemoveInvitationRequest, RemoveInvitationResponse, RemoveOperationIgnoreAllOverrideRequest, RemoveOperationIgnoreAllOverrideResponse, RemoveOperationOverridesRequest, RemoveOperationOverridesResponse, RemoveOrganizationMemberRequest, RemoveOrganizationMemberResponse, RenameNamespaceRequest, RenameNamespaceResponse, RestoreOrganizationRequest, RestoreOrganizationResponse, SetGraphRouterCompatibilityVersionRequest, SetGraphRouterCompatibilityVersionResponse, ToggleChangeOverridesForAllOperationsRequest, ToggleChangeOverridesForAllOperationsResponse, UnlinkSubgraphRequest, UnlinkSubgraphResponse, UpdateAPIKeyRequest, UpdateAPIKeyResponse, UpdateContractRequest, UpdateContractResponse, UpdateFeatureFlagRequest, UpdateFeatureFlagResponse, UpdateFeatureSettingsRequest, UpdateFeatureSettingsResponse, UpdateFederatedGraphRequest, UpdateFederatedGraphResponse, UpdateIDPMappersRequest, UpdateIDPMappersResponse, UpdateIntegrationConfigRequest, UpdateIntegrationConfigResponse, UpdateMonographRequest, UpdateMonographResponse, UpdateNamespaceChecksConfigurationRequest, UpdateNamespaceChecksConfigurationResponse, UpdateOrganizationDetailsRequest, UpdateOrganizationDetailsResponse, UpdateOrganizationGroupRequest, UpdateOrganizationGroupResponse, UpdateOrganizationWebhookConfigRequest, UpdateOrganizationWebhookConfigResponse, UpdateOrgMemberGroupRequest, UpdateOrgMemberGroupResponse, UpdatePlaygroundScriptRequest, UpdatePlaygroundScriptResponse, UpdateProposalRequest, UpdateProposalResponse, UpdateSubgraphRequest, UpdateSubgraphResponse, UpgradePlanRequest, UpgradePlanResponse, ValidateAndFetchPluginDataRequest, ValidateAndFetchPluginDataResponse, VerifyAPIKeyGraphAccessRequest, VerifyAPIKeyGraphAccessResponse, WhoAmIRequest, WhoAmIResponse } from "./platform_pb.js"; import { MethodIdempotency, MethodKind } from "@bufbuild/protobuf"; /** @@ -1969,6 +1969,17 @@ export const PlatformService = { O: RecomposeGraphResponse, kind: MethodKind.Unary, }, + /** + * RecomposeFeatureFlag triggers a recomposition of the feature flag using its current subgraphs + * + * @generated from rpc wg.cosmo.platform.v1.PlatformService.RecomposeFeatureFlag + */ + recomposeFeatureFlag: { + name: "RecomposeFeatureFlag", + I: RecomposeFeatureFlagRequest, + O: RecomposeFeatureFlagResponse, + kind: MethodKind.Unary, + }, /** * Onboarding * diff --git a/connect/src/wg/cosmo/platform/v1/platform_pb.ts b/connect/src/wg/cosmo/platform/v1/platform_pb.ts index 8b8d877277..4cae08f6d9 100644 --- a/connect/src/wg/cosmo/platform/v1/platform_pb.ts +++ b/connect/src/wg/cosmo/platform/v1/platform_pb.ts @@ -25297,6 +25297,122 @@ export class RecomposeGraphResponse extends Message { } } +/** + * @generated from message wg.cosmo.platform.v1.RecomposeFeatureFlagRequest + */ +export class RecomposeFeatureFlagRequest extends Message { + /** + * @generated from field: string name = 1; + */ + name = ""; + + /** + * @generated from field: string namespace = 2; + */ + namespace = ""; + + /** + * @generated from field: optional int32 limit = 3; + */ + limit?: number; + + /** + * @generated from field: optional bool disable_resolvability_validation = 5; + */ + disableResolvabilityValidation?: boolean; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "wg.cosmo.platform.v1.RecomposeFeatureFlagRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "namespace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */, opt: true }, + { no: 5, name: "disable_resolvability_validation", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RecomposeFeatureFlagRequest { + return new RecomposeFeatureFlagRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RecomposeFeatureFlagRequest { + return new RecomposeFeatureFlagRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RecomposeFeatureFlagRequest { + return new RecomposeFeatureFlagRequest().fromJsonString(jsonString, options); + } + + static equals(a: RecomposeFeatureFlagRequest | PlainMessage | undefined, b: RecomposeFeatureFlagRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(RecomposeFeatureFlagRequest, a, b); + } +} + +/** + * @generated from message wg.cosmo.platform.v1.RecomposeFeatureFlagResponse + */ +export class RecomposeFeatureFlagResponse extends Message { + /** + * @generated from field: wg.cosmo.platform.v1.Response response = 1; + */ + response?: Response; + + /** + * @generated from field: repeated wg.cosmo.platform.v1.CompositionError compositionErrors = 2; + */ + compositionErrors: CompositionError[] = []; + + /** + * @generated from field: repeated wg.cosmo.platform.v1.DeploymentError deploymentErrors = 3; + */ + deploymentErrors: DeploymentError[] = []; + + /** + * @generated from field: repeated wg.cosmo.platform.v1.CompositionWarning compositionWarnings = 4; + */ + compositionWarnings: CompositionWarning[] = []; + + /** + * @generated from field: optional wg.cosmo.platform.v1.SubgraphPublishStats errorCounts = 5; + */ + errorCounts?: SubgraphPublishStats; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "wg.cosmo.platform.v1.RecomposeFeatureFlagResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "response", kind: "message", T: Response }, + { no: 2, name: "compositionErrors", kind: "message", T: CompositionError, repeated: true }, + { no: 3, name: "deploymentErrors", kind: "message", T: DeploymentError, repeated: true }, + { no: 4, name: "compositionWarnings", kind: "message", T: CompositionWarning, repeated: true }, + { no: 5, name: "errorCounts", kind: "message", T: SubgraphPublishStats, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RecomposeFeatureFlagResponse { + return new RecomposeFeatureFlagResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RecomposeFeatureFlagResponse { + return new RecomposeFeatureFlagResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RecomposeFeatureFlagResponse { + return new RecomposeFeatureFlagResponse().fromJsonString(jsonString, options); + } + + static equals(a: RecomposeFeatureFlagResponse | PlainMessage | undefined, b: RecomposeFeatureFlagResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(RecomposeFeatureFlagResponse, a, b); + } +} + /** * @generated from message wg.cosmo.platform.v1.GetOnboardingRequest */ diff --git a/controlplane/migrations/0138_lazy_speedball.sql b/controlplane/migrations/0138_lazy_speedball.sql new file mode 100644 index 0000000000..45a009d909 --- /dev/null +++ b/controlplane/migrations/0138_lazy_speedball.sql @@ -0,0 +1,23 @@ +CREATE TABLE IF NOT EXISTS "router_config_hash" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "federated_graph_id" uuid NOT NULL, + "feature_flag_id" uuid, + "hash" text NOT NULL, + "created_at" timestamp DEFAULT now(), + "updated_at" timestamp, + CONSTRAINT "fed_graph_feature_flag_idx" UNIQUE NULLS NOT DISTINCT("federated_graph_id","feature_flag_id") +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "router_config_hash" ADD CONSTRAINT "router_config_hash_federated_graph_id_federated_graphs_id_fk" FOREIGN KEY ("federated_graph_id") REFERENCES "public"."federated_graphs"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "router_config_hash" ADD CONSTRAINT "router_config_hash_feature_flag_id_feature_flags_id_fk" FOREIGN KEY ("feature_flag_id") REFERENCES "public"."feature_flags"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +ALTER TABLE "onboarding" DROP COLUMN IF EXISTS "updated_at"; \ No newline at end of file diff --git a/controlplane/migrations/meta/0138_snapshot.json b/controlplane/migrations/meta/0138_snapshot.json new file mode 100644 index 0000000000..7aa9b0877d --- /dev/null +++ b/controlplane/migrations/meta/0138_snapshot.json @@ -0,0 +1,9083 @@ +{ + "id": "d9d2237f-31b0-415d-b3cc-d921719ab961", + "prevId": "0bd8c2b5-5d88-4e49-92c8-f96c654a74b9", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.api_key_permissions": { + "name": "api_key_permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "api_key_id": { + "name": "api_key_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "akp_api_key_id_idx": { + "name": "akp_api_key_id_idx", + "columns": [ + { + "expression": "api_key_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_key_permissions_api_key_id_api_keys_id_fk": { + "name": "api_key_permissions_api_key_id_api_keys_id_fk", + "tableFrom": "api_key_permissions", + "tableTo": "api_keys", + "columnsFrom": [ + "api_key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.api_key_resources": { + "name": "api_key_resources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "api_key_id": { + "name": "api_key_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "akr_api_key_id_idx": { + "name": "akr_api_key_id_idx", + "columns": [ + { + "expression": "api_key_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "akr_target_id_idx": { + "name": "akr_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_key_resources_api_key_id_api_keys_id_fk": { + "name": "api_key_resources_api_key_id_api_keys_id_fk", + "tableFrom": "api_key_resources", + "tableTo": "api_keys", + "columnsFrom": [ + "api_key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_key_resources_target_id_targets_id_fk": { + "name": "api_key_resources_target_id_targets_id_fk", + "tableFrom": "api_key_resources", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.api_keys": { + "name": "api_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "external": { + "name": "external", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "last_used_at": { + "name": "last_used_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "apikey_name_idx": { + "name": "apikey_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ak_user_id_idx": { + "name": "ak_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ak_organization_id_idx": { + "name": "ak_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_keys_user_id_users_id_fk": { + "name": "api_keys_user_id_users_id_fk", + "tableFrom": "api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_keys_organization_id_organizations_id_fk": { + "name": "api_keys_organization_id_organizations_id_fk", + "tableFrom": "api_keys", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_keys_group_id_organization_groups_id_fk": { + "name": "api_keys_group_id_organization_groups_id_fk", + "tableFrom": "api_keys", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "api_keys_key_unique": { + "name": "api_keys_key_unique", + "nullsNotDistinct": false, + "columns": [ + "key" + ] + } + }, + "checkConstraints": {} + }, + "public.audit_logs": { + "name": "audit_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_slug": { + "name": "organization_slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "audit_action": { + "name": "audit_action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "auditable_type": { + "name": "auditable_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "auditable_display_name": { + "name": "auditable_display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "target_type": { + "name": "target_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_display_name": { + "name": "target_display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_namespace_id": { + "name": "target_namespace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_namespace": { + "name": "target_namespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "actor_id": { + "name": "actor_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "actor_display_name": { + "name": "actor_display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "actor_type": { + "name": "actor_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "api_key_name": { + "name": "api_key_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "auditlogs_organization_idx": { + "name": "auditlogs_organization_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "auditlogs_created_at_idx": { + "name": "auditlogs_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.billing_plans": { + "name": "billing_plans", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "price": { + "name": "price", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "features": { + "name": "features", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "stripe_price_id": { + "name": "stripe_price_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "weight": { + "name": "weight", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.billing_subscriptions": { + "name": "billing_subscriptions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "price_id": { + "name": "price_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "cancel_at_period_end": { + "name": "cancel_at_period_end", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "cancel_at": { + "name": "cancel_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "canceled_at": { + "name": "canceled_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "current_period_start": { + "name": "current_period_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "current_period_end": { + "name": "current_period_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "ended_at": { + "name": "ended_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "trial_start": { + "name": "trial_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "trial_end": { + "name": "trial_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "billsubs_organization_id_idx": { + "name": "billsubs_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "billing_subscriptions_organization_id_organizations_id_fk": { + "name": "billing_subscriptions_organization_id_organizations_id_fk", + "tableFrom": "billing_subscriptions", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.cache_warmer_operations": { + "name": "cache_warmer_operations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "operation_content": { + "name": "operation_content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "operation_hash": { + "name": "operation_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "operation_persisted_id": { + "name": "operation_persisted_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "operation_name": { + "name": "operation_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_name": { + "name": "client_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_version": { + "name": "client_version", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "planning_time": { + "name": "planning_time", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "is_manually_added": { + "name": "is_manually_added", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "cwo_organization_id_idx": { + "name": "cwo_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "cwo_federated_graph_id_idx": { + "name": "cwo_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "cwo_created_by_id_idx": { + "name": "cwo_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cache_warmer_operations_organization_id_organizations_id_fk": { + "name": "cache_warmer_operations_organization_id_organizations_id_fk", + "tableFrom": "cache_warmer_operations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "cache_warmer_operations_federated_graph_id_federated_graphs_id_fk": { + "name": "cache_warmer_operations_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "cache_warmer_operations", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "cache_warmer_operations_created_by_id_users_id_fk": { + "name": "cache_warmer_operations_created_by_id_users_id_fk", + "tableFrom": "cache_warmer_operations", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.contracts": { + "name": "contracts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "source_federated_graph_id": { + "name": "source_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "downstream_federated_graph_id": { + "name": "downstream_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "exclude_tags": { + "name": "exclude_tags", + "type": "text[]", + "primaryKey": false, + "notNull": true + }, + "include_tags": { + "name": "include_tags", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "'{}'::text[]" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_by_id": { + "name": "updated_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "contracts_created_by_id_idx": { + "name": "contracts_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_updated_by_id_idx": { + "name": "contracts_updated_by_id_idx", + "columns": [ + { + "expression": "updated_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_downstream_federated_graph_id_idx": { + "name": "contracts_downstream_federated_graph_id_idx", + "columns": [ + { + "expression": "downstream_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "contracts_source_federated_graph_id_federated_graphs_id_fk": { + "name": "contracts_source_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "contracts", + "tableTo": "federated_graphs", + "columnsFrom": [ + "source_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "contracts_downstream_federated_graph_id_federated_graphs_id_fk": { + "name": "contracts_downstream_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "contracts", + "tableTo": "federated_graphs", + "columnsFrom": [ + "downstream_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "contracts_created_by_id_users_id_fk": { + "name": "contracts_created_by_id_users_id_fk", + "tableFrom": "contracts", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "contracts_updated_by_id_users_id_fk": { + "name": "contracts_updated_by_id_users_id_fk", + "tableFrom": "contracts", + "tableTo": "users", + "columnsFrom": [ + "updated_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_source_downstream_id": { + "name": "federated_graph_source_downstream_id", + "nullsNotDistinct": false, + "columns": [ + "source_federated_graph_id", + "downstream_federated_graph_id" + ] + } + }, + "checkConstraints": {} + }, + "public.feature_flags_to_feature_subgraphs": { + "name": "feature_flags_to_feature_subgraphs", + "schema": "", + "columns": { + "feature_flag_id": { + "name": "feature_flag_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_subgraph_id": { + "name": "feature_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "fffs_feature_flag_id_idx": { + "name": "fffs_feature_flag_id_idx", + "columns": [ + { + "expression": "feature_flag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fffs_feature_subgraph_id_idx": { + "name": "fffs_feature_subgraph_id_idx", + "columns": [ + { + "expression": "feature_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "feature_flags_to_feature_subgraphs_feature_flag_id_feature_flags_id_fk": { + "name": "feature_flags_to_feature_subgraphs_feature_flag_id_feature_flags_id_fk", + "tableFrom": "feature_flags_to_feature_subgraphs", + "tableTo": "feature_flags", + "columnsFrom": [ + "feature_flag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_flags_to_feature_subgraphs_feature_subgraph_id_subgraphs_id_fk": { + "name": "feature_flags_to_feature_subgraphs_feature_subgraph_id_subgraphs_id_fk", + "tableFrom": "feature_flags_to_feature_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "feature_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "feature_flags_to_feature_subgraphs_feature_flag_id_feature_subgraph_id_pk": { + "name": "feature_flags_to_feature_subgraphs_feature_flag_id_feature_subgraph_id_pk", + "columns": [ + "feature_flag_id", + "feature_subgraph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.feature_flags": { + "name": "feature_flags", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "is_enabled": { + "name": "is_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "ff_organization_id_idx": { + "name": "ff_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ff_namespace_id_idx": { + "name": "ff_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ff_created_by_idx": { + "name": "ff_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "feature_flags_organization_id_organizations_id_fk": { + "name": "feature_flags_organization_id_organizations_id_fk", + "tableFrom": "feature_flags", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_flags_namespace_id_namespaces_id_fk": { + "name": "feature_flags_namespace_id_namespaces_id_fk", + "tableFrom": "feature_flags", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_flags_created_by_users_id_fk": { + "name": "feature_flags_created_by_users_id_fk", + "tableFrom": "feature_flags", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.feature_subgraphs_to_base_subgraphs": { + "name": "feature_subgraphs_to_base_subgraphs", + "schema": "", + "columns": { + "feature_subgraph_id": { + "name": "feature_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "base_subgraph_id": { + "name": "base_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "fsbs_feature_subgraph_id_idx": { + "name": "fsbs_feature_subgraph_id_idx", + "columns": [ + { + "expression": "feature_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fsbs_base_subgraph_id_idx": { + "name": "fsbs_base_subgraph_id_idx", + "columns": [ + { + "expression": "base_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_subgraphs_id_fk": { + "name": "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_subgraphs_id_fk", + "tableFrom": "feature_subgraphs_to_base_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "feature_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_subgraphs_to_base_subgraphs_base_subgraph_id_subgraphs_id_fk": { + "name": "feature_subgraphs_to_base_subgraphs_base_subgraph_id_subgraphs_id_fk", + "tableFrom": "feature_subgraphs_to_base_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "base_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_base_subgraph_id_pk": { + "name": "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_base_subgraph_id_pk", + "columns": [ + "feature_subgraph_id", + "base_subgraph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.federated_graph_clients": { + "name": "federated_graph_clients", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_by_id": { + "name": "updated_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fgc_created_by_id_idx": { + "name": "fgc_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgc_updated_by_id_idx": { + "name": "fgc_updated_by_id_idx", + "columns": [ + { + "expression": "updated_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graph_clients_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_graph_clients_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_graph_clients", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graph_clients_created_by_id_users_id_fk": { + "name": "federated_graph_clients_created_by_id_users_id_fk", + "tableFrom": "federated_graph_clients", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "federated_graph_clients_updated_by_id_users_id_fk": { + "name": "federated_graph_clients_updated_by_id_users_id_fk", + "tableFrom": "federated_graph_clients", + "tableTo": "users", + "columnsFrom": [ + "updated_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_client_name": { + "name": "federated_graph_client_name", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id", + "name" + ] + } + }, + "checkConstraints": {} + }, + "public.federated_graph_persisted_operations": { + "name": "federated_graph_persisted_operations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "client_id": { + "name": "client_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "operation_id": { + "name": "operation_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "file_path": { + "name": "file_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "operation_names": { + "name": "operation_names", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "operation_content": { + "name": "operation_content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_by_id": { + "name": "updated_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fgpo_created_by_id_idx": { + "name": "fgpo_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgpo_updated_by_id_idx": { + "name": "fgpo_updated_by_id_idx", + "columns": [ + { + "expression": "updated_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgpo_client_id_idx": { + "name": "fgpo_client_id_idx", + "columns": [ + { + "expression": "client_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graph_persisted_operations_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_graph_persisted_operations_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graph_persisted_operations_client_id_federated_graph_clients_id_fk": { + "name": "federated_graph_persisted_operations_client_id_federated_graph_clients_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "federated_graph_clients", + "columnsFrom": [ + "client_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graph_persisted_operations_created_by_id_users_id_fk": { + "name": "federated_graph_persisted_operations_created_by_id_users_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "federated_graph_persisted_operations_updated_by_id_users_id_fk": { + "name": "federated_graph_persisted_operations_updated_by_id_users_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "users", + "columnsFrom": [ + "updated_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_persisted_operations_file_path_unique": { + "name": "federated_graph_persisted_operations_file_path_unique", + "nullsNotDistinct": false, + "columns": [ + "file_path" + ] + }, + "federated_graph_operation_id": { + "name": "federated_graph_operation_id", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id", + "client_id", + "operation_id" + ] + } + }, + "checkConstraints": {} + }, + "public.federated_graphs": { + "name": "federated_graphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "routing_url": { + "name": "routing_url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "composed_schema_version_id": { + "name": "composed_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "admission_webhook_url": { + "name": "admission_webhook_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "admission_webhook_secret": { + "name": "admission_webhook_secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "supports_federation": { + "name": "supports_federation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "router_compatibility_version": { + "name": "router_compatibility_version", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'1'" + } + }, + "indexes": { + "fgs_target_id_idx": { + "name": "fgs_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgs_composed_schema_version_id_idx": { + "name": "fgs_composed_schema_version_id_idx", + "columns": [ + { + "expression": "composed_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graphs_target_id_targets_id_fk": { + "name": "federated_graphs_target_id_targets_id_fk", + "tableFrom": "federated_graphs", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_composed_schema_version_id_schema_versions_id_fk": { + "name": "federated_graphs_composed_schema_version_id_schema_versions_id_fk", + "tableFrom": "federated_graphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "composed_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.federated_graphs_to_feature_flag_schema_versions": { + "name": "federated_graphs_to_feature_flag_schema_versions", + "schema": "", + "columns": { + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "base_composition_schema_version_id": { + "name": "base_composition_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "composed_schema_version_id": { + "name": "composed_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_flag_id": { + "name": "feature_flag_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fgffsv_federated_graph_id_idx": { + "name": "fgffsv_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_base_composition_schema_version_id_idx": { + "name": "fgffsv_base_composition_schema_version_id_idx", + "columns": [ + { + "expression": "base_composition_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_composed_schema_version_id_idx": { + "name": "fgffsv_composed_schema_version_id_idx", + "columns": [ + { + "expression": "composed_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_feature_flag_id_idx": { + "name": "fgffsv_feature_flag_id_idx", + "columns": [ + { + "expression": "feature_flag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_to_feature_flag_schema_versions_base_composition_schema_version_id_schema_versions_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_base_composition_schema_version_id_schema_versions_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "base_composition_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_to_feature_flag_schema_versions_composed_schema_version_id_schema_versions_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_composed_schema_version_id_schema_versions_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "composed_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_to_feature_flag_schema_versions_feature_flag_id_feature_flags_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_feature_flag_id_feature_flags_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "feature_flags", + "columnsFrom": [ + "feature_flag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_base_composition_schema_version_id_composed_schema_version_id_pk": { + "name": "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_base_composition_schema_version_id_composed_schema_version_id_pk", + "columns": [ + "federated_graph_id", + "base_composition_schema_version_id", + "composed_schema_version_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.field_grace_period": { + "name": "field_grace_period", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "is_deprecated": { + "name": "is_deprecated", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "unique_field_grace_period_idx": { + "name": "unique_field_grace_period_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "is_deprecated", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgp_subgraph_id_idx": { + "name": "fgp_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgp_organization_id_idx": { + "name": "fgp_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgp_namespace_id_idx": { + "name": "fgp_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "field_grace_period_subgraph_id_subgraphs_id_fk": { + "name": "field_grace_period_subgraph_id_subgraphs_id_fk", + "tableFrom": "field_grace_period", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_grace_period_organization_id_organizations_id_fk": { + "name": "field_grace_period_organization_id_organizations_id_fk", + "tableFrom": "field_grace_period", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_grace_period_namespace_id_namespaces_id_fk": { + "name": "field_grace_period_namespace_id_namespaces_id_fk", + "tableFrom": "field_grace_period", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.git_installations": { + "name": "git_installations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "git_installation_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "provider_account_id": { + "name": "provider_account_id", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "provider_installation_id": { + "name": "provider_installation_id", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "provider_name": { + "name": "provider_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "oauth_token": { + "name": "oauth_token", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.graph_api_tokens": { + "name": "graph_api_tokens", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "graphApiToken_name_idx": { + "name": "graphApiToken_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "gat_organization_id_idx": { + "name": "gat_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "gat_federated_graph_id_idx": { + "name": "gat_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "gat_created_by_idx": { + "name": "gat_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_api_tokens_organization_id_organizations_id_fk": { + "name": "graph_api_tokens_organization_id_organizations_id_fk", + "tableFrom": "graph_api_tokens", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_api_tokens_federated_graph_id_federated_graphs_id_fk": { + "name": "graph_api_tokens_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "graph_api_tokens", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_api_tokens_created_by_users_id_fk": { + "name": "graph_api_tokens_created_by_users_id_fk", + "tableFrom": "graph_api_tokens", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "graph_api_tokens_token_unique": { + "name": "graph_api_tokens_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "checkConstraints": {} + }, + "public.graph_composition_subgraphs": { + "name": "graph_composition_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "graph_composition_id": { + "name": "graph_composition_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_target_id": { + "name": "subgraph_target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_name": { + "name": "subgraph_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "graph_composition_subgraph_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'unchanged'" + }, + "is_feature_subgraph": { + "name": "is_feature_subgraph", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "graphcompsub_graph_composition_id_idx": { + "name": "graphcompsub_graph_composition_id_idx", + "columns": [ + { + "expression": "graph_composition_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "graphcompsub_schema_version_id_idx": { + "name": "graphcompsub_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_composition_subgraphs_graph_composition_id_graph_compositions_id_fk": { + "name": "graph_composition_subgraphs_graph_composition_id_graph_compositions_id_fk", + "tableFrom": "graph_composition_subgraphs", + "tableTo": "graph_compositions", + "columnsFrom": [ + "graph_composition_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_composition_subgraphs_schema_version_id_schema_versions_id_fk": { + "name": "graph_composition_subgraphs_schema_version_id_schema_versions_id_fk", + "tableFrom": "graph_composition_subgraphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.graph_compositions": { + "name": "graph_compositions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "is_composable": { + "name": "is_composable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "composition_errors": { + "name": "composition_errors", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composition_warnings": { + "name": "composition_warnings", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "router_config_signature": { + "name": "router_config_signature", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deployment_error": { + "name": "deployment_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "admission_error": { + "name": "admission_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_by_email": { + "name": "created_by_email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_feature_flag_composition": { + "name": "is_feature_flag_composition", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "router_compatibility_version": { + "name": "router_compatibility_version", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'1'" + } + }, + "indexes": { + "graphcomp_schema_version_id_idx": { + "name": "graphcomp_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "graphcomp_created_by_id_idx": { + "name": "graphcomp_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_compositions_schema_version_id_schema_versions_id_fk": { + "name": "graph_compositions_schema_version_id_schema_versions_id_fk", + "tableFrom": "graph_compositions", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_compositions_created_by_id_users_id_fk": { + "name": "graph_compositions_created_by_id_users_id_fk", + "tableFrom": "graph_compositions", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.graph_request_keys": { + "name": "graph_request_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "grk_organization_id_idx": { + "name": "grk_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "grk_federated_graph_id_idx": { + "name": "grk_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_request_keys_organization_id_organizations_id_fk": { + "name": "graph_request_keys_organization_id_organizations_id_fk", + "tableFrom": "graph_request_keys", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_request_keys_federated_graph_id_federated_graphs_id_fk": { + "name": "graph_request_keys_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "graph_request_keys", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "graph_request_keys_federated_graph_id_unique": { + "name": "graph_request_keys_federated_graph_id_unique", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id" + ] + }, + "graph_request_keys_privateKey_unique": { + "name": "graph_request_keys_privateKey_unique", + "nullsNotDistinct": false, + "columns": [ + "privateKey" + ] + }, + "graph_request_keys_publicKey_unique": { + "name": "graph_request_keys_publicKey_unique", + "nullsNotDistinct": false, + "columns": [ + "publicKey" + ] + } + }, + "checkConstraints": {} + }, + "public.linked_schema_checks": { + "name": "linked_schema_checks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "linked_schema_check_id": { + "name": "linked_schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "lsc_schema_check_id_linked_schema_check_id_unique": { + "name": "lsc_schema_check_id_linked_schema_check_id_unique", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "linked_schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lsc_schema_check_id_idx": { + "name": "lsc_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lsc_linked_schema_check_id_idx": { + "name": "lsc_linked_schema_check_id_idx", + "columns": [ + { + "expression": "linked_schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "linked_schema_checks_schema_check_id_schema_checks_id_fk": { + "name": "linked_schema_checks_schema_check_id_schema_checks_id_fk", + "tableFrom": "linked_schema_checks", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "linked_schema_checks_linked_schema_check_id_schema_checks_id_fk": { + "name": "linked_schema_checks_linked_schema_check_id_schema_checks_id_fk", + "tableFrom": "linked_schema_checks", + "tableTo": "schema_checks", + "columnsFrom": [ + "linked_schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.linked_subgraphs": { + "name": "linked_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "source_subgraph_id": { + "name": "source_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_subgraph_id": { + "name": "target_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "ls_source_subgraph_id_idx": { + "name": "ls_source_subgraph_id_idx", + "columns": [ + { + "expression": "source_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ls_target_subgraph_id_idx": { + "name": "ls_target_subgraph_id_idx", + "columns": [ + { + "expression": "target_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ls_created_by_id_idx": { + "name": "ls_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "linked_subgraphs_source_subgraph_id_subgraphs_id_fk": { + "name": "linked_subgraphs_source_subgraph_id_subgraphs_id_fk", + "tableFrom": "linked_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "source_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "linked_subgraphs_target_subgraph_id_subgraphs_id_fk": { + "name": "linked_subgraphs_target_subgraph_id_subgraphs_id_fk", + "tableFrom": "linked_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "target_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "linked_subgraphs_created_by_id_users_id_fk": { + "name": "linked_subgraphs_created_by_id_users_id_fk", + "tableFrom": "linked_subgraphs", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "linked_subgraphs_source_subgraph_id_unique": { + "name": "linked_subgraphs_source_subgraph_id_unique", + "nullsNotDistinct": false, + "columns": [ + "source_subgraph_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_cache_warmer_config": { + "name": "namespace_cache_warmer_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "max_operations_count": { + "name": "max_operations_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "nscwc_namespace_id_idx": { + "name": "nscwc_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_cache_warmer_config_namespace_id_namespaces_id_fk": { + "name": "namespace_cache_warmer_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_cache_warmer_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "namespace_cache_warmer_config_namespace_id_unique": { + "name": "namespace_cache_warmer_config_namespace_id_unique", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_config": { + "name": "namespace_config", + "schema": "", + "columns": { + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "enable_linting": { + "name": "enable_linting", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_graph_pruning": { + "name": "enable_graph_pruning", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_cache_warming": { + "name": "enable_cache_warming", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "checks_timeframe_in_days": { + "name": "checks_timeframe_in_days", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "enable_proposals": { + "name": "enable_proposals", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_subgraph_check_extensions": { + "name": "enable_subgraph_check_extensions", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "namespace_config_namespace_id_namespaces_id_fk": { + "name": "namespace_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_namespace": { + "name": "unique_namespace", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_graph_pruning_check_config": { + "name": "namespace_graph_pruning_check_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "graph_pruning_rule": { + "name": "graph_pruning_rule", + "type": "graph_pruning_rules", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "severity_level": { + "name": "severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "grace_period": { + "name": "grace_period", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "scheme_usage_check_period": { + "name": "scheme_usage_check_period", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "nsgpcc_namespace_id_idx": { + "name": "nsgpcc_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_graph_pruning_check_config_namespace_id_namespaces_id_fk": { + "name": "namespace_graph_pruning_check_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_graph_pruning_check_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.namespace_lint_check_config": { + "name": "namespace_lint_check_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "lint_rule": { + "name": "lint_rule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "severity_level": { + "name": "severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "nslcc_namespace_id_idx": { + "name": "nslcc_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_lint_check_config_namespace_id_namespaces_id_fk": { + "name": "namespace_lint_check_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_lint_check_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.namespace_proposal_config": { + "name": "namespace_proposal_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "check_severity_level": { + "name": "check_severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "publish_severity_level": { + "name": "publish_severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "namespace_proposal_config_namespace_id_namespaces_id_fk": { + "name": "namespace_proposal_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_proposal_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "npc_namespace_id_idx": { + "name": "npc_namespace_id_idx", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_subgraph_check_extensions_config": { + "name": "namespace_subgraph_check_extensions_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secret_key": { + "name": "secret_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "include_composed_sdl": { + "name": "include_composed_sdl", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_linting_issues": { + "name": "include_linting_issues", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_pruning_issues": { + "name": "include_pruning_issues", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_schema_changes": { + "name": "include_schema_changes", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_affected_operations": { + "name": "include_affected_operations", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": { + "nsce_namespace_id_idx": { + "name": "nsce_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_subgraph_check_extensions_config_namespace_id_namespaces_id_fk": { + "name": "namespace_subgraph_check_extensions_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_subgraph_check_extensions_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "namespace_subgraph_check_extensions_config_namespace_id_unique": { + "name": "namespace_subgraph_check_extensions_config_namespace_id_unique", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespaces": { + "name": "namespaces", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "ns_organization_id_idx": { + "name": "ns_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ns_created_by_idx": { + "name": "ns_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespaces_organization_id_organizations_id_fk": { + "name": "namespaces_organization_id_organizations_id_fk", + "tableFrom": "namespaces", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "namespaces_created_by_users_id_fk": { + "name": "namespaces_created_by_users_id_fk", + "tableFrom": "namespaces", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_name": { + "name": "unique_name", + "nullsNotDistinct": false, + "columns": [ + "name", + "organization_id" + ] + } + }, + "checkConstraints": {} + }, + "public.oidc_providers": { + "name": "oidc_providers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "alias": { + "name": "alias", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "oidcp_organization_id_idx": { + "name": "oidcp_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "oidc_providers_organization_id_organizations_id_fk": { + "name": "oidc_providers_organization_id_organizations_id_fk", + "tableFrom": "oidc_providers", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "oidc_providers_alias_unique": { + "name": "oidc_providers_alias_unique", + "nullsNotDistinct": false, + "columns": [ + "alias" + ] + } + }, + "checkConstraints": {} + }, + "public.onboarding": { + "name": "onboarding", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "finished_at": { + "name": "finished_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "version": { + "name": "version", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "slack": { + "name": "slack", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "email": { + "name": "email", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "onboarding_user_id_users_id_fk": { + "name": "onboarding_user_id_users_id_fk", + "tableFrom": "onboarding", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "onboarding_organization_id_organizations_id_fk": { + "name": "onboarding_organization_id_organizations_id_fk", + "tableFrom": "onboarding", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "onboarding_user_id_organization_id_version_unique": { + "name": "onboarding_user_id_organization_id_version_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id", + "organization_id", + "version" + ] + } + }, + "checkConstraints": {} + }, + "public.operation_change_overrides": { + "name": "operation_change_overrides", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "schema_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "hash_change_idx": { + "name": "hash_change_idx", + "columns": [ + { + "expression": "hash", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "change_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "oco_created_by_idx": { + "name": "oco_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_change_overrides_created_by_users_id_fk": { + "name": "operation_change_overrides_created_by_users_id_fk", + "tableFrom": "operation_change_overrides", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.operation_ignore_all_overrides": { + "name": "operation_ignore_all_overrides", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "hash_namespace_ignore_idx": { + "name": "hash_namespace_ignore_idx", + "columns": [ + { + "expression": "hash", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "oiao_created_by_idx": { + "name": "oiao_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_ignore_all_overrides_created_by_users_id_fk": { + "name": "operation_ignore_all_overrides_created_by_users_id_fk", + "tableFrom": "operation_ignore_all_overrides", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_billing": { + "name": "organization_billing", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "plan": { + "name": "plan", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripe_customer_id": { + "name": "stripe_customer_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "organization_billing_idx": { + "name": "organization_billing_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organization_billing_stripe_idx": { + "name": "organization_billing_stripe_idx", + "columns": [ + { + "expression": "stripe_customer_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_billing_organization_id_organizations_id_fk": { + "name": "organization_billing_organization_id_organizations_id_fk", + "tableFrom": "organization_billing", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_features": { + "name": "organization_features", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature": { + "name": "feature", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "limit": { + "name": "limit", + "type": "real", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "organization_feature_idx": { + "name": "organization_feature_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "feature", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orgf_organization_id_idx": { + "name": "orgf_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_features_organization_id_organizations_id_fk": { + "name": "organization_features_organization_id_organizations_id_fk", + "tableFrom": "organization_features", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_members": { + "name": "organization_group_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_member_id": { + "name": "organization_member_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "organization_member_group_idx": { + "name": "organization_member_group_idx", + "columns": [ + { + "expression": "organization_member_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "group_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_group_members_organization_member_id_organization_members_id_fk": { + "name": "organization_group_members_organization_member_id_organization_members_id_fk", + "tableFrom": "organization_group_members", + "tableTo": "organization_members", + "columnsFrom": [ + "organization_member_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_group_members_group_id_organization_groups_id_fk": { + "name": "organization_group_members_group_id_organization_groups_id_fk", + "tableFrom": "organization_group_members", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_rule_namespaces": { + "name": "organization_group_rule_namespaces", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "rule_id": { + "name": "rule_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_group_rule_namespaces_rule_id_organization_group_rules_id_fk": { + "name": "organization_group_rule_namespaces_rule_id_organization_group_rules_id_fk", + "tableFrom": "organization_group_rule_namespaces", + "tableTo": "organization_group_rules", + "columnsFrom": [ + "rule_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_group_rule_namespaces_namespace_id_namespaces_id_fk": { + "name": "organization_group_rule_namespaces_namespace_id_namespaces_id_fk", + "tableFrom": "organization_group_rule_namespaces", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_rule_targets": { + "name": "organization_group_rule_targets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "rule_id": { + "name": "rule_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_group_rule_targets_rule_id_organization_group_rules_id_fk": { + "name": "organization_group_rule_targets_rule_id_organization_group_rules_id_fk", + "tableFrom": "organization_group_rule_targets", + "tableTo": "organization_group_rules", + "columnsFrom": [ + "rule_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_group_rule_targets_target_id_targets_id_fk": { + "name": "organization_group_rule_targets_target_id_targets_id_fk", + "tableFrom": "organization_group_rule_targets", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_rules": { + "name": "organization_group_rules", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "organization_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_group_rules_group_id_organization_groups_id_fk": { + "name": "organization_group_rules_group_id_organization_groups_id_fk", + "tableFrom": "organization_group_rules", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_groups": { + "name": "organization_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "builtin": { + "name": "builtin", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "kc_group_id": { + "name": "kc_group_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "organization_groups_organization_id_organizations_id_fk": { + "name": "organization_groups_organization_id_organizations_id_fk", + "tableFrom": "organization_groups", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_groups_kc_group_id_unique": { + "name": "organization_groups_kc_group_id_unique", + "nullsNotDistinct": false, + "columns": [ + "kc_group_id" + ] + } + }, + "checkConstraints": {} + }, + "public.organization_integrations": { + "name": "organization_integrations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "events": { + "name": "events", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "integration_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "organization_integration_idx": { + "name": "organization_integration_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orgint_organization_id_idx": { + "name": "orgint_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_integrations_organization_id_organizations_id_fk": { + "name": "organization_integrations_organization_id_organizations_id_fk", + "tableFrom": "organization_integrations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_invitation_groups": { + "name": "organization_invitation_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "invitation_id": { + "name": "invitation_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "org_inv_invitation_idx": { + "name": "org_inv_invitation_idx", + "columns": [ + { + "expression": "invitation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "org_inv_group_id": { + "name": "org_inv_group_id", + "columns": [ + { + "expression": "group_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_invitation_groups_invitation_id_organization_invitations_id_fk": { + "name": "organization_invitation_groups_invitation_id_organization_invitations_id_fk", + "tableFrom": "organization_invitation_groups", + "tableTo": "organization_invitations", + "columnsFrom": [ + "invitation_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_invitation_groups_group_id_organization_groups_id_fk": { + "name": "organization_invitation_groups_group_id_organization_groups_id_fk", + "tableFrom": "organization_invitation_groups", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_invitations": { + "name": "organization_invitations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "invited_by": { + "name": "invited_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "accepted": { + "name": "accepted", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "last_sent_at": { + "name": "last_sent_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "orginv_organization_id_idx": { + "name": "orginv_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orginv_user_id_idx": { + "name": "orginv_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orginv_invited_by_idx": { + "name": "orginv_invited_by_idx", + "columns": [ + { + "expression": "invited_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_invitations_organization_id_organizations_id_fk": { + "name": "organization_invitations_organization_id_organizations_id_fk", + "tableFrom": "organization_invitations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_invitations_user_id_users_id_fk": { + "name": "organization_invitations_user_id_users_id_fk", + "tableFrom": "organization_invitations", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_invitations_invited_by_users_id_fk": { + "name": "organization_invitations_invited_by_users_id_fk", + "tableFrom": "organization_invitations", + "tableTo": "users", + "columnsFrom": [ + "invited_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_member_roles": { + "name": "organization_member_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_member_id": { + "name": "organization_member_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "member_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "organization_member_role_idx": { + "name": "organization_member_role_idx", + "columns": [ + { + "expression": "organization_member_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_member_roles_organization_member_id_organization_members_id_fk": { + "name": "organization_member_roles_organization_member_id_organization_members_id_fk", + "tableFrom": "organization_member_roles", + "tableTo": "organization_members", + "columnsFrom": [ + "organization_member_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_webhook_configs": { + "name": "organization_webhook_configs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "events": { + "name": "events", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "orgwc_organization_id_idx": { + "name": "orgwc_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_webhook_configs_organization_id_organizations_id_fk": { + "name": "organization_webhook_configs_organization_id_organizations_id_fk", + "tableFrom": "organization_webhook_configs", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organizations": { + "name": "organizations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "invite_code": { + "name": "invite_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "kc_group_id": { + "name": "kc_group_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "is_deactivated": { + "name": "is_deactivated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "deactivation_reason": { + "name": "deactivation_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deactivated_at": { + "name": "deactivated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "queued_for_deletion_at": { + "name": "queued_for_deletion_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "queued_for_deletion_by": { + "name": "queued_for_deletion_by", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "orgs_created_by_idx": { + "name": "orgs_created_by_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organizations_user_id_users_id_fk": { + "name": "organizations_user_id_users_id_fk", + "tableFrom": "organizations", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organizations_slug_unique": { + "name": "organizations_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + }, + "organizations_kc_group_id_unique": { + "name": "organizations_kc_group_id_unique", + "nullsNotDistinct": false, + "columns": [ + "kc_group_id" + ] + } + }, + "checkConstraints": {} + }, + "public.organization_members": { + "name": "organization_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "organization_member_idx": { + "name": "organization_member_idx", + "columns": [ + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "unique_organization_member_idx": { + "name": "unique_organization_member_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orgm_organization_id_idx": { + "name": "orgm_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_members_user_id_users_id_fk": { + "name": "organization_members_user_id_users_id_fk", + "tableFrom": "organization_members", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_members_organization_id_organizations_id_fk": { + "name": "organization_members_organization_id_organizations_id_fk", + "tableFrom": "organization_members", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.playground_scripts": { + "name": "playground_scripts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "type": { + "name": "type", + "type": "playground_script_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": { + "ps_organization_id_idx": { + "name": "ps_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ps_created_by_id_idx": { + "name": "ps_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "playground_scripts_organization_id_organizations_id_fk": { + "name": "playground_scripts_organization_id_organizations_id_fk", + "tableFrom": "playground_scripts", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "playground_scripts_created_by_id_users_id_fk": { + "name": "playground_scripts_created_by_id_users_id_fk", + "tableFrom": "playground_scripts", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.plugin_image_versions": { + "name": "plugin_image_versions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "version": { + "name": "version", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "platform": { + "name": "platform", + "type": "text[]", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "plugin_image_versions_schema_version_id_schema_versions_id_fk": { + "name": "plugin_image_versions_schema_version_id_schema_versions_id_fk", + "tableFrom": "plugin_image_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.proposal_checks": { + "name": "proposal_checks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proposal_id": { + "name": "proposal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "pc_check_id_proposal_id_idx": { + "name": "pc_check_id_proposal_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "proposal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "proposal_checks_schema_check_id_schema_checks_id_fk": { + "name": "proposal_checks_schema_check_id_schema_checks_id_fk", + "tableFrom": "proposal_checks", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "proposal_checks_proposal_id_proposals_id_fk": { + "name": "proposal_checks_proposal_id_proposals_id_fk", + "tableFrom": "proposal_checks", + "tableTo": "proposals", + "columnsFrom": [ + "proposal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.proposal_subgraphs": { + "name": "proposal_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "proposal_id": { + "name": "proposal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "subgraph_name": { + "name": "subgraph_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "schema_sdl": { + "name": "schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_new": { + "name": "is_new", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "is_published": { + "name": "is_published", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "current_schema_version_id": { + "name": "current_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "proposal_subgraphs_proposal_id_proposals_id_fk": { + "name": "proposal_subgraphs_proposal_id_proposals_id_fk", + "tableFrom": "proposal_subgraphs", + "tableTo": "proposals", + "columnsFrom": [ + "proposal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "proposal_subgraphs_subgraph_id_subgraphs_id_fk": { + "name": "proposal_subgraphs_subgraph_id_subgraphs_id_fk", + "tableFrom": "proposal_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "proposal_subgraphs_current_schema_version_id_schema_versions_id_fk": { + "name": "proposal_subgraphs_current_schema_version_id_schema_versions_id_fk", + "tableFrom": "proposal_subgraphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "current_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "proposal_subgraph": { + "name": "proposal_subgraph", + "nullsNotDistinct": false, + "columns": [ + "proposal_id", + "subgraph_name" + ] + } + }, + "checkConstraints": {} + }, + "public.proposals": { + "name": "proposals", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "state": { + "name": "state", + "type": "proposal_state", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "origin": { + "name": "origin", + "type": "proposal_origin", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'INTERNAL'" + } + }, + "indexes": { + "pr_created_by_id_idx": { + "name": "pr_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pr_federated_graph_id_idx": { + "name": "pr_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "proposals_federated_graph_id_federated_graphs_id_fk": { + "name": "proposals_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "proposals", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "proposals_created_by_id_users_id_fk": { + "name": "proposals_created_by_id_users_id_fk", + "tableFrom": "proposals", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_proposal_name": { + "name": "federated_graph_proposal_name", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id", + "name" + ] + } + }, + "checkConstraints": {} + }, + "public.protobuf_schema_versions": { + "name": "protobuf_schema_versions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proto_schema": { + "name": "proto_schema", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "proto_mappings": { + "name": "proto_mappings", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "proto_lock": { + "name": "proto_lock", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "protobuf_schema_versions_schema_version_id_schema_versions_id_fk": { + "name": "protobuf_schema_versions_schema_version_id_schema_versions_id_fk", + "tableFrom": "protobuf_schema_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.router_config_hash": { + "name": "router_config_hash", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_flag_id": { + "name": "feature_flag_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "router_config_hash_federated_graph_id_federated_graphs_id_fk": { + "name": "router_config_hash_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "router_config_hash", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "router_config_hash_feature_flag_id_feature_flags_id_fk": { + "name": "router_config_hash_feature_flag_id_feature_flags_id_fk", + "tableFrom": "router_config_hash", + "tableTo": "feature_flags", + "columnsFrom": [ + "feature_flag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "fed_graph_feature_flag_idx": { + "name": "fed_graph_feature_flag_idx", + "nullsNotDistinct": true, + "columns": [ + "federated_graph_id", + "feature_flag_id" + ] + } + }, + "checkConstraints": {} + }, + "public.schema_check_change_action": { + "name": "schema_check_change_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "schema_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "change_message": { + "name": "change_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_breaking": { + "name": "is_breaking", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_fed_graph_change": { + "name": "is_fed_graph_change", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "scca_schema_check_id_idx": { + "name": "scca_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_change_action_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_change_action_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_change_action", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_change_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_change_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_change_action", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_change_operation_usage": { + "name": "schema_check_change_operation_usage", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_change_action_id": { + "name": "schema_check_change_action_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_safe_override": { + "name": "is_safe_override", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "sccou_schema_check_change_action_id_idx": { + "name": "sccou_schema_check_change_action_id_idx", + "columns": [ + { + "expression": "schema_check_change_action_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sccou_federated_graph_id_idx": { + "name": "sccou_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_change_operation_usage_schema_check_change_action_id_schema_check_change_action_id_fk": { + "name": "schema_check_change_operation_usage_schema_check_change_action_id_schema_check_change_action_id_fk", + "tableFrom": "schema_check_change_operation_usage", + "tableTo": "schema_check_change_action", + "columnsFrom": [ + "schema_check_change_action_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_change_operation_usage_federated_graph_id_federated_graphs_id_fk": { + "name": "schema_check_change_operation_usage_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "schema_check_change_operation_usage", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_composition": { + "name": "schema_check_composition", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "composition_errors": { + "name": "composition_errors", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composition_warnings": { + "name": "composition_warnings", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composed_schema_sdl": { + "name": "composed_schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_schema": { + "name": "client_schema", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "scc_schema_check_id_idx": { + "name": "scc_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scc_target_id_idx": { + "name": "scc_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_composition_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_composition_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_composition", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_composition_target_id_targets_id_fk": { + "name": "schema_check_composition_target_id_targets_id_fk", + "tableFrom": "schema_check_composition", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_federated_graph_changes": { + "name": "schema_check_federated_graph_changes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_federated_graph_id": { + "name": "schema_check_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "schema_check_change_action_id": { + "name": "schema_check_change_action_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "scfgsc_schema_check_federated_graph_id_idx": { + "name": "scfgsc_schema_check_federated_graph_id_idx", + "columns": [ + { + "expression": "schema_check_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scfgsc_schema_check_change_action_id_idx": { + "name": "scfgsc_schema_check_change_action_id_idx", + "columns": [ + { + "expression": "schema_check_change_action_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scfgc_fed_graph_change_action_unique": { + "name": "scfgc_fed_graph_change_action_unique", + "columns": [ + { + "expression": "schema_check_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "schema_check_change_action_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_federated_graph_changes_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk": { + "name": "schema_check_federated_graph_changes_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk", + "tableFrom": "schema_check_federated_graph_changes", + "tableTo": "schema_check_federated_graphs", + "columnsFrom": [ + "schema_check_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_federated_graph_changes_schema_check_change_action_id_schema_check_change_action_id_fk": { + "name": "schema_check_federated_graph_changes_schema_check_change_action_id_schema_check_change_action_id_fk", + "tableFrom": "schema_check_federated_graph_changes", + "tableTo": "schema_check_change_action", + "columnsFrom": [ + "schema_check_change_action_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_federated_graphs": { + "name": "schema_check_federated_graphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "check_id": { + "name": "check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "traffic_check_days": { + "name": "traffic_check_days", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "scfg_check_id_idx": { + "name": "scfg_check_id_idx", + "columns": [ + { + "expression": "check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scfg_federated_graph_id_idx": { + "name": "scfg_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_federated_graphs_check_id_schema_checks_id_fk": { + "name": "schema_check_federated_graphs_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_federated_graphs", + "tableTo": "schema_checks", + "columnsFrom": [ + "check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_federated_graphs_federated_graph_id_federated_graphs_id_fk": { + "name": "schema_check_federated_graphs_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "schema_check_federated_graphs", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_graph_pruning_action": { + "name": "schema_check_graph_pruning_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "graph_pruning_rule": { + "name": "graph_pruning_rule", + "type": "graph_pruning_rules", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "field_path": { + "name": "field_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_error": { + "name": "is_error", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "location": { + "name": "location", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "scgpa_schema_check_id_idx": { + "name": "scgpa_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scgpa_federated_graph_id_idx": { + "name": "scgpa_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_graph_pruning_action_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_graph_pruning_action_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_graph_pruning_action", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_graph_pruning_action_federated_graph_id_federated_graphs_id_fk": { + "name": "schema_check_graph_pruning_action_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "schema_check_graph_pruning_action", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_graph_pruning_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_graph_pruning_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_graph_pruning_action", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_lint_action": { + "name": "schema_check_lint_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "lint_rule_type": { + "name": "lint_rule_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_error": { + "name": "is_error", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "location": { + "name": "location", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sclact_schema_check_id_idx": { + "name": "sclact_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_lint_action_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_lint_action_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_lint_action", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_lint_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_lint_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_lint_action", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_proposal_match": { + "name": "schema_check_proposal_match", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proposal_id": { + "name": "proposal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proposal_match": { + "name": "proposal_match", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "scpm_schema_check_id_idx": { + "name": "scpm_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scpm_proposal_id_idx": { + "name": "scpm_proposal_id_idx", + "columns": [ + { + "expression": "proposal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_proposal_match_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_proposal_match_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_proposal_match", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_proposal_match_proposal_id_proposals_id_fk": { + "name": "schema_check_proposal_match_proposal_id_proposals_id_fk", + "tableFrom": "schema_check_proposal_match", + "tableTo": "proposals", + "columnsFrom": [ + "proposal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_schema_check_proposal_match": { + "name": "unique_schema_check_proposal_match", + "nullsNotDistinct": false, + "columns": [ + "schema_check_id", + "proposal_id" + ] + } + }, + "checkConstraints": {} + }, + "public.schema_check_subgraphs": { + "name": "schema_check_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "subgraph_name": { + "name": "subgraph_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "proposed_subgraph_schema_sdl": { + "name": "proposed_subgraph_schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_new": { + "name": "is_new", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "scs_schema_check_id_idx": { + "name": "scs_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scs_subgraph_id_idx": { + "name": "scs_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_subgraphs_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_subgraphs_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_subgraphs", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_subgraphs_subgraph_id_subgraphs_id_fk": { + "name": "schema_check_subgraphs_subgraph_id_subgraphs_id_fk", + "tableFrom": "schema_check_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "schema_check_subgraphs_namespace_id_namespaces_id_fk": { + "name": "schema_check_subgraphs_namespace_id_namespaces_id_fk", + "tableFrom": "schema_check_subgraphs", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_subgraphs_federated_graphs": { + "name": "schema_check_subgraphs_federated_graphs", + "schema": "", + "columns": { + "schema_check_federated_graph_id": { + "name": "schema_check_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "scsfg_schema_check_subgraph_id_idx": { + "name": "scsfg_schema_check_subgraph_id_idx", + "columns": [ + { + "expression": "schema_check_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scsfg_schema_check_federated_graph_id_idx": { + "name": "scsfg_schema_check_federated_graph_id_idx", + "columns": [ + { + "expression": "schema_check_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_subgraphs_federated_graphs_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk": { + "name": "schema_check_subgraphs_federated_graphs_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk", + "tableFrom": "schema_check_subgraphs_federated_graphs", + "tableTo": "schema_check_federated_graphs", + "columnsFrom": [ + "schema_check_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_subgraphs_federated_graphs_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_subgraphs_federated_graphs_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_subgraphs_federated_graphs", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_checks": { + "name": "schema_checks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_composable": { + "name": "is_composable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_breaking_changes": { + "name": "has_breaking_changes", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_lint_errors": { + "name": "has_lint_errors", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_graph_pruning_errors": { + "name": "has_graph_pruning_errors", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_client_traffic": { + "name": "has_client_traffic", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "proposal_match": { + "name": "proposal_match", + "type": "proposal_match", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "client_traffic_check_skipped": { + "name": "client_traffic_check_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "lint_skipped": { + "name": "lint_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "graph_pruning_skipped": { + "name": "graph_pruning_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "composition_skipped": { + "name": "composition_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "breaking_changes_skipped": { + "name": "breaking_changes_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "proposed_subgraph_schema_sdl": { + "name": "proposed_subgraph_schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "gh_details": { + "name": "gh_details", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "forced_success": { + "name": "forced_success", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "vcs_context": { + "name": "vcs_context", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "check_extension_delivery_id": { + "name": "check_extension_delivery_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "check_extension_error_message": { + "name": "check_extension_error_message", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sc_target_id_idx": { + "name": "sc_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_checks_target_id_targets_id_fk": { + "name": "schema_checks_target_id_targets_id_fk", + "tableFrom": "schema_checks", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_checks_check_extension_delivery_id_webhook_deliveries_id_fk": { + "name": "schema_checks_check_extension_delivery_id_webhook_deliveries_id_fk", + "tableFrom": "schema_checks", + "tableTo": "webhook_deliveries", + "columnsFrom": [ + "check_extension_delivery_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_versions": { + "name": "schema_versions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "schema_sdl": { + "name": "schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_schema": { + "name": "client_schema", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "is_v2_graph": { + "name": "is_v2_graph", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sv_organization_id_idx": { + "name": "sv_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sv_target_id_idx": { + "name": "sv_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_versions_organization_id_organizations_id_fk": { + "name": "schema_versions_organization_id_organizations_id_fk", + "tableFrom": "schema_versions", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_version_change_action": { + "name": "schema_version_change_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "schema_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "change_message": { + "name": "change_message", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "svca_schema_version_id_idx": { + "name": "svca_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_version_change_action_schema_version_id_schema_versions_id_fk": { + "name": "schema_version_change_action_schema_version_id_schema_versions_id_fk", + "tableFrom": "schema_version_change_action", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sessions_user_id_idx": { + "name": "sessions_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "sessions_user_id_unique": { + "name": "sessions_user_id_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id" + ] + } + }, + "checkConstraints": {} + }, + "public.slack_installations": { + "name": "slack_installations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "slack_organization_id": { + "name": "slack_organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_organization_name": { + "name": "slack_organization_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_channel_id": { + "name": "slack_channel_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_channel_name": { + "name": "slack_channel_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_user_id": { + "name": "slack_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "slack_installations_idx": { + "name": "slack_installations_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "slack_organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "slack_channel_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "slackinst_organization_id_idx": { + "name": "slackinst_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_installations_organization_id_organizations_id_fk": { + "name": "slack_installations_organization_id_organizations_id_fk", + "tableFrom": "slack_installations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.slack_integration_configs": { + "name": "slack_integration_configs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "integration_id": { + "name": "integration_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "slackintconf_integration_id_idx": { + "name": "slackintconf_integration_id_idx", + "columns": [ + { + "expression": "integration_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_integration_configs_integration_id_organization_integrations_id_fk": { + "name": "slack_integration_configs_integration_id_organization_integrations_id_fk", + "tableFrom": "slack_integration_configs", + "tableTo": "organization_integrations", + "columnsFrom": [ + "integration_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.slack_schema_update_event_configs": { + "name": "slack_schema_update_event_configs", + "schema": "", + "columns": { + "slack_integration_config_id": { + "name": "slack_integration_config_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "slacksuec_slack_integration_config_id_idx": { + "name": "slacksuec_slack_integration_config_id_idx", + "columns": [ + { + "expression": "slack_integration_config_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "slacksuec_federated_graph_id_idx": { + "name": "slacksuec_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_schema_update_event_configs_slack_integration_config_id_slack_integration_configs_id_fk": { + "name": "slack_schema_update_event_configs_slack_integration_config_id_slack_integration_configs_id_fk", + "tableFrom": "slack_schema_update_event_configs", + "tableTo": "slack_integration_configs", + "columnsFrom": [ + "slack_integration_config_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "slack_schema_update_event_configs_federated_graph_id_federated_graphs_id_fk": { + "name": "slack_schema_update_event_configs_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "slack_schema_update_event_configs", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "slack_schema_update_event_configs_slack_integration_config_id_federated_graph_id_pk": { + "name": "slack_schema_update_event_configs_slack_integration_config_id_federated_graph_id_pk", + "columns": [ + "slack_integration_config_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.subgraph_members": { + "name": "subgraph_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "unique_subgraph_member_idx": { + "name": "unique_subgraph_member_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sm_user_id_idx": { + "name": "sm_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sm_subgraph_id_idx": { + "name": "sm_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "subgraph_members_user_id_users_id_fk": { + "name": "subgraph_members_user_id_users_id_fk", + "tableFrom": "subgraph_members", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "subgraph_members_subgraph_id_subgraphs_id_fk": { + "name": "subgraph_members_subgraph_id_subgraphs_id_fk", + "tableFrom": "subgraph_members", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.subgraphs": { + "name": "subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "routing_url": { + "name": "routing_url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "subscription_url": { + "name": "subscription_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "subscription_protocol": { + "name": "subscription_protocol", + "type": "subscription_protocol", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'ws'" + }, + "websocket_subprotocol": { + "name": "websocket_subprotocol", + "type": "websocket_subprotocol", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'auto'" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "is_feature_subgraph": { + "name": "is_feature_subgraph", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_event_driven_graph": { + "name": "is_event_driven_graph", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "type": { + "name": "type", + "type": "subgraph_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'standard'" + } + }, + "indexes": { + "subgraphs_target_id_idx": { + "name": "subgraphs_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "subgraphs_schema_version_id_idx": { + "name": "subgraphs_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "subgraphs_schema_version_id_schema_versions_id_fk": { + "name": "subgraphs_schema_version_id_schema_versions_id_fk", + "tableFrom": "subgraphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "subgraphs_target_id_targets_id_fk": { + "name": "subgraphs_target_id_targets_id_fk", + "tableFrom": "subgraphs", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.federated_subgraphs": { + "name": "federated_subgraphs", + "schema": "", + "columns": { + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "fs_federated_graph_id_idx": { + "name": "fs_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fs_subgraph_id_idx": { + "name": "fs_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_subgraphs_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_subgraphs_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_subgraphs", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_subgraphs_subgraph_id_subgraphs_id_fk": { + "name": "federated_subgraphs_subgraph_id_subgraphs_id_fk", + "tableFrom": "federated_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "federated_subgraphs_federated_graph_id_subgraph_id_pk": { + "name": "federated_subgraphs_federated_graph_id_subgraph_id_pk", + "columns": [ + "federated_graph_id", + "subgraph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.target_label_matchers": { + "name": "target_label_matchers", + "schema": "", + "columns": { + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "label_matcher": { + "name": "label_matcher", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "tlm_target_id_idx": { + "name": "tlm_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "target_label_matchers_target_id_targets_id_fk": { + "name": "target_label_matchers_target_id_targets_id_fk", + "tableFrom": "target_label_matchers", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.targets": { + "name": "targets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "target_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "readme": { + "name": "readme", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "organization_name_idx": { + "name": "organization_name_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "targets_organization_id_idx": { + "name": "targets_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "targets_created_by_idx": { + "name": "targets_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "targets_namespace_id_idx": { + "name": "targets_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "targets_organization_id_organizations_id_fk": { + "name": "targets_organization_id_organizations_id_fk", + "tableFrom": "targets", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "targets_created_by_users_id_fk": { + "name": "targets_created_by_users_id_fk", + "tableFrom": "targets", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "targets_namespace_id_namespaces_id_fk": { + "name": "targets_namespace_id_namespaces_id_fk", + "tableFrom": "targets", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "checkConstraints": {} + }, + "public.webhook_deliveries": { + "name": "webhook_deliveries", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "webhook_delivery_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "event_name": { + "name": "event_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "payload": { + "name": "payload", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "request_headers": { + "name": "request_headers", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "response_headers": { + "name": "response_headers", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "response_status_code": { + "name": "response_status_code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "response_error_code": { + "name": "response_error_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "response_body": { + "name": "response_body", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "retry_count": { + "name": "retry_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "duration": { + "name": "duration", + "type": "real", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "original_delivery_id": { + "name": "original_delivery_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "webhd_organization_id_idx": { + "name": "webhd_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "webhd_created_by_id_idx": { + "name": "webhd_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_deliveries_created_by_id_users_id_fk": { + "name": "webhook_deliveries_created_by_id_users_id_fk", + "tableFrom": "webhook_deliveries", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "webhook_deliveries_organization_id_organizations_id_fk": { + "name": "webhook_deliveries_organization_id_organizations_id_fk", + "tableFrom": "webhook_deliveries", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.webhook_graph_schema_update": { + "name": "webhook_graph_schema_update", + "schema": "", + "columns": { + "webhook_id": { + "name": "webhook_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "wgsu_webhook_id_idx": { + "name": "wgsu_webhook_id_idx", + "columns": [ + { + "expression": "webhook_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wgsu_federated_graph_id_idx": { + "name": "wgsu_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_graph_schema_update_webhook_id_organization_webhook_configs_id_fk": { + "name": "webhook_graph_schema_update_webhook_id_organization_webhook_configs_id_fk", + "tableFrom": "webhook_graph_schema_update", + "tableTo": "organization_webhook_configs", + "columnsFrom": [ + "webhook_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "webhook_graph_schema_update_federated_graph_id_federated_graphs_id_fk": { + "name": "webhook_graph_schema_update_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "webhook_graph_schema_update", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "webhook_graph_schema_update_webhook_id_federated_graph_id_pk": { + "name": "webhook_graph_schema_update_webhook_id_federated_graph_id_pk", + "columns": [ + "webhook_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.webhook_proposal_state_update": { + "name": "webhook_proposal_state_update", + "schema": "", + "columns": { + "webhook_id": { + "name": "webhook_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "wpsu_webhook_id_idx": { + "name": "wpsu_webhook_id_idx", + "columns": [ + { + "expression": "webhook_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wpsu_federated_graph_id_idx": { + "name": "wpsu_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_proposal_state_update_webhook_id_organization_webhook_configs_id_fk": { + "name": "webhook_proposal_state_update_webhook_id_organization_webhook_configs_id_fk", + "tableFrom": "webhook_proposal_state_update", + "tableTo": "organization_webhook_configs", + "columnsFrom": [ + "webhook_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "webhook_proposal_state_update_federated_graph_id_federated_graphs_id_fk": { + "name": "webhook_proposal_state_update_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "webhook_proposal_state_update", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "webhook_proposal_state_update_webhook_id_federated_graph_id_pk": { + "name": "webhook_proposal_state_update_webhook_id_federated_graph_id_pk", + "columns": [ + "webhook_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "enums": { + "public.git_installation_type": { + "name": "git_installation_type", + "schema": "public", + "values": [ + "PERSONAL", + "ORGANIZATION" + ] + }, + "public.graph_composition_subgraph_change_type": { + "name": "graph_composition_subgraph_change_type", + "schema": "public", + "values": [ + "added", + "removed", + "updated", + "unchanged" + ] + }, + "public.graph_pruning_rules": { + "name": "graph_pruning_rules", + "schema": "public", + "values": [ + "UNUSED_FIELDS", + "DEPRECATED_FIELDS", + "REQUIRE_DEPRECATION_BEFORE_DELETION" + ] + }, + "public.integration_type": { + "name": "integration_type", + "schema": "public", + "values": [ + "slack" + ] + }, + "public.lint_severity": { + "name": "lint_severity", + "schema": "public", + "values": [ + "warn", + "error" + ] + }, + "public.member_role": { + "name": "member_role", + "schema": "public", + "values": [ + "admin", + "developer", + "viewer" + ] + }, + "public.organization_role": { + "name": "organization_role", + "schema": "public", + "values": [ + "organization-admin", + "organization-developer", + "organization-viewer", + "organization-apikey-manager", + "namespace-admin", + "namespace-viewer", + "graph-admin", + "graph-viewer", + "subgraph-admin", + "subgraph-publisher", + "subgraph-checker", + "subgraph-viewer" + ] + }, + "public.playground_script_type": { + "name": "playground_script_type", + "schema": "public", + "values": [ + "pre-flight", + "pre-operation", + "post-operation" + ] + }, + "public.proposal_match": { + "name": "proposal_match", + "schema": "public", + "values": [ + "success", + "warn", + "error" + ] + }, + "public.proposal_origin": { + "name": "proposal_origin", + "schema": "public", + "values": [ + "INTERNAL", + "EXTERNAL" + ] + }, + "public.proposal_state": { + "name": "proposal_state", + "schema": "public", + "values": [ + "DRAFT", + "APPROVED", + "PUBLISHED", + "CLOSED" + ] + }, + "public.schema_change_type": { + "name": "schema_change_type", + "schema": "public", + "values": [ + "FIELD_ARGUMENT_DESCRIPTION_CHANGED", + "FIELD_ARGUMENT_DEFAULT_CHANGED", + "FIELD_ARGUMENT_TYPE_CHANGED", + "DIRECTIVE_REMOVED", + "DIRECTIVE_ADDED", + "DIRECTIVE_DESCRIPTION_CHANGED", + "DIRECTIVE_LOCATION_ADDED", + "DIRECTIVE_LOCATION_REMOVED", + "DIRECTIVE_ARGUMENT_ADDED", + "DIRECTIVE_ARGUMENT_REMOVED", + "DIRECTIVE_ARGUMENT_DESCRIPTION_CHANGED", + "DIRECTIVE_ARGUMENT_DEFAULT_VALUE_CHANGED", + "DIRECTIVE_ARGUMENT_TYPE_CHANGED", + "ENUM_VALUE_REMOVED", + "ENUM_VALUE_ADDED", + "ENUM_VALUE_DESCRIPTION_CHANGED", + "ENUM_VALUE_DEPRECATION_REASON_CHANGED", + "ENUM_VALUE_DEPRECATION_REASON_ADDED", + "ENUM_VALUE_DEPRECATION_REASON_REMOVED", + "FIELD_REMOVED", + "FIELD_ADDED", + "FIELD_DESCRIPTION_CHANGED", + "FIELD_DESCRIPTION_ADDED", + "FIELD_DESCRIPTION_REMOVED", + "FIELD_DEPRECATION_ADDED", + "FIELD_DEPRECATION_REMOVED", + "FIELD_DEPRECATION_REASON_CHANGED", + "FIELD_DEPRECATION_REASON_ADDED", + "FIELD_DEPRECATION_REASON_REMOVED", + "FIELD_TYPE_CHANGED", + "FIELD_ARGUMENT_ADDED", + "FIELD_ARGUMENT_REMOVED", + "INPUT_FIELD_REMOVED", + "INPUT_FIELD_ADDED", + "INPUT_FIELD_DESCRIPTION_ADDED", + "INPUT_FIELD_DESCRIPTION_REMOVED", + "INPUT_FIELD_DESCRIPTION_CHANGED", + "INPUT_FIELD_DEFAULT_VALUE_CHANGED", + "INPUT_FIELD_TYPE_CHANGED", + "OBJECT_TYPE_INTERFACE_ADDED", + "OBJECT_TYPE_INTERFACE_REMOVED", + "SCHEMA_QUERY_TYPE_CHANGED", + "SCHEMA_MUTATION_TYPE_CHANGED", + "SCHEMA_SUBSCRIPTION_TYPE_CHANGED", + "TYPE_REMOVED", + "TYPE_ADDED", + "TYPE_KIND_CHANGED", + "TYPE_DESCRIPTION_CHANGED", + "TYPE_DESCRIPTION_REMOVED", + "TYPE_DESCRIPTION_ADDED", + "UNION_MEMBER_REMOVED", + "UNION_MEMBER_ADDED", + "DIRECTIVE_USAGE_UNION_MEMBER_ADDED", + "DIRECTIVE_USAGE_UNION_MEMBER_REMOVED", + "DIRECTIVE_USAGE_ENUM_ADDED", + "DIRECTIVE_USAGE_ENUM_REMOVED", + "DIRECTIVE_USAGE_ENUM_VALUE_ADDED", + "DIRECTIVE_USAGE_ENUM_VALUE_REMOVED", + "DIRECTIVE_USAGE_INPUT_OBJECT_ADDED", + "DIRECTIVE_USAGE_INPUT_OBJECT_REMOVED", + "DIRECTIVE_USAGE_FIELD_ADDED", + "DIRECTIVE_USAGE_FIELD_REMOVED", + "DIRECTIVE_USAGE_SCALAR_ADDED", + "DIRECTIVE_USAGE_SCALAR_REMOVED", + "DIRECTIVE_USAGE_OBJECT_ADDED", + "DIRECTIVE_USAGE_OBJECT_REMOVED", + "DIRECTIVE_USAGE_INTERFACE_ADDED", + "DIRECTIVE_USAGE_INTERFACE_REMOVED", + "DIRECTIVE_USAGE_ARGUMENT_DEFINITION_ADDED", + "DIRECTIVE_USAGE_ARGUMENT_DEFINITION_REMOVED", + "DIRECTIVE_USAGE_SCHEMA_ADDED", + "DIRECTIVE_USAGE_SCHEMA_REMOVED", + "DIRECTIVE_USAGE_FIELD_DEFINITION_ADDED", + "DIRECTIVE_USAGE_FIELD_DEFINITION_REMOVED", + "DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_ADDED", + "DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_REMOVED" + ] + }, + "public.subgraph_type": { + "name": "subgraph_type", + "schema": "public", + "values": [ + "standard", + "grpc_plugin", + "grpc_service" + ] + }, + "public.subscription_protocol": { + "name": "subscription_protocol", + "schema": "public", + "values": [ + "ws", + "sse", + "sse_post" + ] + }, + "public.status": { + "name": "status", + "schema": "public", + "values": [ + "incomplete", + "incomplete_expired", + "trialing", + "active", + "past_due", + "canceled", + "unpaid", + "paused" + ] + }, + "public.target_type": { + "name": "target_type", + "schema": "public", + "values": [ + "federated", + "subgraph" + ] + }, + "public.webhook_delivery_type": { + "name": "webhook_delivery_type", + "schema": "public", + "values": [ + "webhook", + "slack", + "admission", + "check-extension" + ] + }, + "public.websocket_subprotocol": { + "name": "websocket_subprotocol", + "schema": "public", + "values": [ + "auto", + "graphql-ws", + "graphql-transport-ws" + ] + } + }, + "schemas": {}, + "sequences": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/controlplane/migrations/meta/_journal.json b/controlplane/migrations/meta/_journal.json index f685a66282..cd1b00af4c 100644 --- a/controlplane/migrations/meta/_journal.json +++ b/controlplane/migrations/meta/_journal.json @@ -967,6 +967,13 @@ "when": 1775025668087, "tag": "0137_icy_sasquatch", "breakpoints": true + }, + { + "idx": 138, + "version": "7", + "when": 1778492417221, + "tag": "0138_lazy_speedball", + "breakpoints": true } ] -} +} \ No newline at end of file diff --git a/controlplane/src/core/bufservices/PlatformService.ts b/controlplane/src/core/bufservices/PlatformService.ts index 3bea63a9eb..7dc89ae112 100644 --- a/controlplane/src/core/bufservices/PlatformService.ts +++ b/controlplane/src/core/bufservices/PlatformService.ts @@ -50,6 +50,7 @@ import { getFeatureSubgraphs } from './feature-flag/getFeatureSubgraphs.js'; import { getFeatureSubgraphsByFederatedGraph } from './feature-flag/getFeatureSubgraphsByFederatedGraph.js'; import { getFeatureSubgraphsByFeatureFlag } from './feature-flag/getFeatureSubgraphsByFeatureFlag.js'; import { updateFeatureFlag } from './feature-flag/updateFeatureFlag.js'; +import { recomposeFeatureFlag } from './feature-flag/recomposeFeatureFlag.js'; import { checkFederatedGraph } from './federated-graph/checkFederatedGraph.js'; import { createFederatedGraph } from './federated-graph/createFederatedGraph.js'; import { createFederatedGraphToken } from './federated-graph/createFederatedGraphToken.js'; @@ -161,6 +162,7 @@ import { removeOrganizationMember } from './user/removeOrganizationMember.js'; import { updateOrgMemberGroup } from './user/updateOrgMemberGroup.js'; import { deleteCacheWarmerOperation } from './cache-warmer/deleteCacheWarmerOperation.js'; import { setGraphRouterCompatibilityVersion } from './graph/setGraphRouterCompatibilityVersion.js'; +import { recomposeGraph } from './graph/recomposeGraph.js'; import { getOrganizationBySlug } from './organization/getOrganizationBySlug.js'; import { getProposedSchemaOfCheckedSubgraph } from './check/getProposedSchemaOfCheckedSubgraph.js'; import { getProposalsByFederatedGraph } from './proposal/getProposalsByFederatedGraph.js'; @@ -184,7 +186,6 @@ import { getSubgraphCheckExtensionsConfig } from './check-extensions/getSubgraph import { configureSubgraphCheckExtensions } from './check-extensions/configureSubgraphCheckExtensions.js'; import { initializeCosmoUser } from './user/initializeCosmoUser.js'; import { listOrganizations } from './organization/listOrganizations.js'; -import { recomposeGraph } from './graph/recomposeGraph.js'; export default function (opts: RouterOptions): Partial> { return { @@ -925,6 +926,10 @@ export default function (opts: RouterOptions): Partial { + return recomposeFeatureFlag(opts, req, ctx); + }, + getOnboarding: (req, ctx) => { return getOnboarding(opts, req, ctx); }, diff --git a/controlplane/src/core/bufservices/contract/createContract.ts b/controlplane/src/core/bufservices/contract/createContract.ts index 2f28c3ec1d..93fa200ca4 100644 --- a/controlplane/src/core/bufservices/contract/createContract.ts +++ b/controlplane/src/core/bufservices/contract/createContract.ts @@ -1,13 +1,7 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { - CompositionError, - CompositionWarning, - CreateContractRequest, - CreateContractResponse, - DeploymentError, -} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; +import { CreateContractRequest, CreateContractResponse } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { PublicError, UnauthorizedError } from '../../errors/errors.js'; @@ -18,6 +12,7 @@ import { DefaultNamespace, NamespaceRepository } from '../../repositories/Namesp import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidGraphName, isValidSchemaTags } from '../../util.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function createContract( opts: RouterOptions, @@ -77,7 +72,6 @@ export function createContract( } req.excludeTags = [...new Set(req.excludeTags)]; - if (!isValidSchemaTags(req.excludeTags)) { throw new PublicError(EnumStatusCode.ERR, `Provided exclude tags are invalid`); } @@ -100,7 +94,6 @@ export function createContract( } const count = await fedGraphRepo.count(); - const feature = await orgRepo.getFeature({ organizationId: authContext.organizationId, featureId: 'federated-graphs', @@ -111,7 +104,6 @@ export function createContract( }); const limit = feature?.limit === -1 ? undefined : feature?.limit; - if (limit && count >= limit) { throw new PublicError( EnumStatusCode.ERR_LIMIT_REACHED, @@ -190,55 +182,31 @@ export function createContract( targetNamespaceDisplayName: contractGraph.namespace, }); - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - disableResolvabilityValidation: req.disableResolvabilityValidation, - }, - federatedGraphs: [{ ...contractGraph, contract }], - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); - - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - compositionWarnings, - deploymentErrors: [], - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - compositionWarnings, - deploymentErrors, - }; - } + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + const { deploymentErrors, compositionErrors, compositionWarnings } = + await compositionService.composeAndDeployFederatedGraph({ + actorId: authContext.userId, + federatedGraph: { ...contractGraph, contract }, + }); return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, compositionWarnings, diff --git a/controlplane/src/core/bufservices/contract/updateContract.ts b/controlplane/src/core/bufservices/contract/updateContract.ts index 11ff2f418a..06bda62af1 100644 --- a/controlplane/src/core/bufservices/contract/updateContract.ts +++ b/controlplane/src/core/bufservices/contract/updateContract.ts @@ -2,23 +2,16 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; -import { - CompositionError, - CompositionWarning, - DeploymentError, - UpdateContractRequest, - UpdateContractResponse, -} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; +import { UpdateContractRequest, UpdateContractResponse } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { ContractRepository } from '../../repositories/ContractRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidSchemaTags } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateContract( opts: RouterOptions, @@ -34,8 +27,6 @@ export function updateContract( logger = enrichLogger(ctx, logger, authContext); const fedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const contractRepo = new ContractRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const auditLogRepo = new AuditLogRepository(opts.db); const orgWebhooks = new OrganizationWebhookService( opts.db, @@ -120,81 +111,57 @@ export function updateContract( }; } - const ignoreExternalKeys = - ( - await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }) - )?.enabled ?? false; - - const updatedContractDetails = await contractRepo.update({ - id: graph.contract.id, - excludeTags: req.excludeTags, - includeTags: req.includeTags, - actorId: authContext.userId, - }); - - await fedGraphRepo.update({ - targetId: graph.targetId, - // if the routingUrl is not provided, it will be set to an empty string. - // As the routing url wont be updated in this case. - routingUrl: req.routingUrl || '', - updatedBy: authContext.userId, - readme: req.readme, - blobStorage: opts.blobStorage, - namespaceId: graph.namespaceId, - admissionWebhookURL: req.admissionWebhookUrl, - admissionWebhookSecret: req.admissionWebhookSecret, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - labelMatchers: [], - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys, - }, - webhookProxyUrl: opts.webhookProxyUrl, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys, - }, - federatedGraphs: [ - { - ...graph, + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { + const contractRepo = new ContractRepository(logger, tx, authContext.organizationId); + const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + // Update the contract details + const updatedContractDetails = await contractRepo.update({ + id: graph.contract!.id, + excludeTags: req.excludeTags, + includeTags: req.includeTags, + actorId: authContext.userId, + }); + + // Update the federated graph details + await fedGraphRepo.update({ + compositionService, + targetId: graph.targetId, + // if the routingUrl is not provided, it will be set to an empty string. + // As the routing url wont be updated in this case. + routingUrl: req.routingUrl || '', + updatedBy: authContext.userId, + readme: req.readme, + namespaceId: graph.namespaceId, + admissionWebhookURL: req.admissionWebhookUrl, + admissionWebhookSecret: req.admissionWebhookSecret, + labelMatchers: [], + }); + + // Compose the contract + return await compositionService.composeAndDeployFederatedGraph({ + actorId: authContext.userId, + federatedGraph: { + ...graph!, routingUrl: req.routingUrl || graph.routingUrl, admissionWebhookURL: req.admissionWebhookUrl || graph.admissionWebhookURL, admissionWebhookSecret: req.admissionWebhookSecret || graph.admissionWebhookSecret, readme: req.readme || graph.readme, - contract: { - ...graph.contract, - ...updatedContractDetails, - }, + contract: { ...graph.contract!, ...updatedContractDetails }, }, - ], - webhookProxyUrl: opts.webhookProxyUrl, + }); }); - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); - await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, @@ -230,31 +197,14 @@ export function updateContract( authContext.userId, ); - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - deploymentErrors: [], - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, deploymentErrors, compositionErrors, diff --git a/controlplane/src/core/bufservices/feature-flag/createFeatureFlag.ts b/controlplane/src/core/bufservices/feature-flag/createFeatureFlag.ts index bdd5fd6ad5..dc5213bb86 100644 --- a/controlplane/src/core/bufservices/feature-flag/createFeatureFlag.ts +++ b/controlplane/src/core/bufservices/feature-flag/createFeatureFlag.ts @@ -1,24 +1,18 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, CreateFeatureFlagRequest, CreateFeatureFlagResponse, - DeploymentError, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; -import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidLabels } from '../../util.js'; -import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function createFeatureFlag( opts: RouterOptions, @@ -34,16 +28,8 @@ export function createFeatureFlag( const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - const orgWebhooks = new OrganizationWebhookService( - opts.db, - authContext.organizationId, - opts.logger, - opts.billingDefaultPlanId, - opts.webhookProxyUrl, - ); req.namespace = req.namespace || DefaultNamespace; - if (authContext.organizationDeactivated) { throw new UnauthorizedError(); } @@ -75,7 +61,6 @@ export function createFeatureFlag( if (limit !== undefined && limit !== null) { const count = await featureFlagRepo.count(authContext.organizationId); - if (count >= limit) { return { response: { @@ -149,7 +134,6 @@ export function createFeatureFlag( } const auditLogRepo = new AuditLogRepository(opts.db); - const featureFlag = await featureFlagRepo.createFeatureFlag({ namespaceId: namespace.id, name: req.name, @@ -186,94 +170,50 @@ export function createFeatureFlag( }; } - const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ + const createdFeatureFlag = await featureFlagRepo.getFeatureFlagById({ featureFlagId: featureFlag.id, namespaceId: namespace.id, - excludeDisabled: true, - }); - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, + includeSubgraphs: true, }); - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs, - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); - }); - - for (const graph of federatedGraphs) { - const hasErrors = - compositionErrors.some((error) => error.federatedGraphName === graph.name) || - deploymentErrors.some((error) => error.federatedGraphName === graph.name); - orgWebhooks.send( - { - eventName: OrganizationEventName.FEDERATED_GRAPH_SCHEMA_UPDATED, - payload: { - federated_graph: { - id: graph.id, - name: graph.name, - namespace: graph.namespace, - }, - organization: { - id: authContext.organizationId, - slug: authContext.organizationSlug, - }, - errors: hasErrors, - actor_id: authContext.userId, - }, - }, - authContext.userId, - ); - } - - if (compositionErrors.length > 0) { + if (!createdFeatureFlag) { return { response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, + code: EnumStatusCode.ERR_NOT_FOUND, + details: `Feature flag "${featureFlag.name}" was not found after creation.`, }, - compositionErrors, + compositionErrors: [], deploymentErrors: [], - compositionWarnings, + compositionWarnings: [], }; } - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return compositionService.composeAndDeployFeatureFlag({ + actorId: authContext.userId, + featureFlag: createdFeatureFlag, + }); + }); return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, deploymentErrors, diff --git a/controlplane/src/core/bufservices/feature-flag/deleteFeatureFlag.ts b/controlplane/src/core/bufservices/feature-flag/deleteFeatureFlag.ts index 089cae5d45..54c7e9fa6b 100644 --- a/controlplane/src/core/bufservices/feature-flag/deleteFeatureFlag.ts +++ b/controlplane/src/core/bufservices/feature-flag/deleteFeatureFlag.ts @@ -1,24 +1,17 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, DeleteFeatureFlagRequest, DeleteFeatureFlagResponse, - DeploymentError, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; -import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; -import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function deleteFeatureFlag( opts: RouterOptions, @@ -33,17 +26,8 @@ export function deleteFeatureFlag( const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - const orgWebhooks = new OrganizationWebhookService( - opts.db, - authContext.organizationId, - opts.logger, - opts.billingDefaultPlanId, - opts.webhookProxyUrl, - ); req.namespace = req.namespace || DefaultNamespace; - if (authContext.organizationDeactivated) { throw new UnauthorizedError(); } @@ -82,44 +66,32 @@ export function deleteFeatureFlag( throw new UnauthorizedError(); } - // Collect the federated graph DTOs that have the feature flag enabled because they will be re-composed - const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ - featureFlagId: featureFlag.id, - namespaceId: namespace.id, - // if deleting when already disabled, there are no compositions to be done. - excludeDisabled: true, - }); + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { + const auditLogRepo = new AuditLogRepository(tx); + const featureFlagRepo = new FeatureFlagRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - /* Check that the user is authorized to delete the feature flag - * The user must have authorization for each related federated graph - * */ - for (const federatedGraph of federatedGraphs) { - // check if the user is authorized to perform the action - await opts.authorizer.authorize({ - db: opts.db, - graph: { - targetId: federatedGraph.targetId, - targetType: 'federatedGraph', + const result = await compositionService.deleteFeatureFlag({ + actorId: authContext.userId, + featureFlag, + authorize(graph) { + return opts.authorizer.authorize({ + db: tx, + graph: { targetId: graph.targetId, targetType: 'federatedGraph' }, + headers: ctx.requestHeader, + authContext, + }); }, - headers: ctx.requestHeader, - authContext, }); - } - - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - const auditLogRepo = new AuditLogRepository(tx); - - await featureFlagRepo.delete(featureFlag.id); await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, @@ -136,74 +108,17 @@ export function deleteFeatureFlag( targetNamespaceDisplayName: namespace.name, }); - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs, - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); + return result; }); - for (const graph of federatedGraphs) { - orgWebhooks.send( - { - eventName: OrganizationEventName.FEDERATED_GRAPH_SCHEMA_UPDATED, - payload: { - federated_graph: { - id: graph.id, - name: graph.name, - namespace: graph.namespace, - }, - organization: { - id: authContext.organizationId, - slug: authContext.organizationSlug, - }, - errors: compositionErrors.length > 0 || deploymentErrors.length > 0, - actor_id: authContext.userId, - }, - }, - authContext.userId, - ); - } - - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - deploymentErrors: [], - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, deploymentErrors, diff --git a/controlplane/src/core/bufservices/feature-flag/enableFeatureFlag.ts b/controlplane/src/core/bufservices/feature-flag/enableFeatureFlag.ts index 909932ce44..a97bd1683b 100644 --- a/controlplane/src/core/bufservices/feature-flag/enableFeatureFlag.ts +++ b/controlplane/src/core/bufservices/feature-flag/enableFeatureFlag.ts @@ -1,24 +1,17 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, - DeploymentError, EnableFeatureFlagRequest, EnableFeatureFlagResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; -import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; -import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function enableFeatureFlag( opts: RouterOptions, @@ -33,18 +26,9 @@ export function enableFeatureFlag( const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const auditLogRepo = new AuditLogRepository(opts.db); - const orgWebhooks = new OrganizationWebhookService( - opts.db, - authContext.organizationId, - opts.logger, - opts.billingDefaultPlanId, - opts.webhookProxyUrl, - ); req.namespace = req.namespace || DefaultNamespace; - if (authContext.organizationDeactivated) { throw new UnauthorizedError(); } @@ -95,73 +79,32 @@ export function enableFeatureFlag( }; } - await featureFlagRepo.enableFeatureFlag({ - featureFlagId: featureFlag.id, - namespaceId: namespace.id, - isEnabled: req.enabled, - }); - - const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ - featureFlagId: featureFlag.id, - namespaceId: namespace.id, - // fetch the federated graphs based on the state that has just been set for the feature flag above - excludeDisabled: req.enabled, - }); - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { + const txFeatureFlagRepo = new FeatureFlagRepository(logger, tx, authContext.organizationId); + await txFeatureFlagRepo.enableFeatureFlag({ + featureFlagId: featureFlag.id, + namespaceId: namespace.id, + isEnabled: req.enabled, + }); - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - const composition = await fedGraphRepo.composeAndDeployGraphs({ + return compositionService.composeAndDeployFeatureFlag({ actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs, - webhookProxyUrl: opts.webhookProxyUrl, + featureFlag, + isEnabled: req.enabled, }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); }); - for (const graph of federatedGraphs) { - orgWebhooks.send( - { - eventName: OrganizationEventName.FEDERATED_GRAPH_SCHEMA_UPDATED, - payload: { - federated_graph: { - id: graph.id, - name: graph.name, - namespace: graph.namespace, - }, - organization: { - id: authContext.organizationId, - slug: authContext.organizationSlug, - }, - errors: compositionErrors.length > 0 || deploymentErrors.length > 0, - actor_id: authContext.userId, - }, - }, - authContext.userId, - ); - } - await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, @@ -177,31 +120,14 @@ export function enableFeatureFlag( targetNamespaceDisplayName: featureFlag.namespace, }); - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - deploymentErrors: [], - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, deploymentErrors, diff --git a/controlplane/src/core/bufservices/feature-flag/recomposeFeatureFlag.ts b/controlplane/src/core/bufservices/feature-flag/recomposeFeatureFlag.ts new file mode 100644 index 0000000000..f636e786c1 --- /dev/null +++ b/controlplane/src/core/bufservices/feature-flag/recomposeFeatureFlag.ts @@ -0,0 +1,155 @@ +import { PlainMessage } from '@bufbuild/protobuf'; +import { HandlerContext } from '@connectrpc/connect'; +import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; +import { + RecomposeFeatureFlagRequest, + RecomposeFeatureFlagResponse, +} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; +import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; +import type { RouterOptions } from '../../routes.js'; +import { clamp, enrichLogger, getLogger, handleError } from '../../util.js'; +import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; +import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; +import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; +import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; +import { maxRowLimitForChecks } from '../../constants.js'; + +export function recomposeFeatureFlag( + opts: RouterOptions, + req: RecomposeFeatureFlagRequest, + ctx: HandlerContext, +): Promise> { + let logger = getLogger(ctx, opts.logger); + + return handleError>(ctx, logger, async () => { + const authContext = await opts.authenticator.authenticate(ctx.requestHeader); + logger = enrichLogger(ctx, logger, authContext); + + req.namespace = req.namespace || DefaultNamespace; + if (authContext.organizationDeactivated) { + throw new UnauthorizedError(); + } + + const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); + const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); + const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); + + // Make sure that the config splitting is enabled for the organization + const feature = await orgRepo.getFeature({ + organizationId: authContext.organizationId, + featureId: 'split-config-loading', + }); + + if (!feature?.enabled) { + return { + response: { + code: EnumStatusCode.ERR, + details: 'Configuration splitting not enabled', + }, + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + } + + // Validate that the namespace exists for the organization + const namespace = await namespaceRepo.byName(req.namespace); + if (!namespace) { + return { + response: { + code: EnumStatusCode.ERR_NOT_FOUND, + details: `Could not find namespace ${req.namespace}`, + }, + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + } + + // Validate that the feature flag exists in the namespace + const featureFlag = await featureFlagRepo.getFeatureFlagByName({ + featureFlagName: req.name, + namespaceId: namespace.id, + }); + + if (!featureFlag) { + return { + response: { + code: EnumStatusCode.ERR_NOT_FOUND, + details: `The feature flag "${req.name}" was not found`, + }, + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + } + + if (!authContext.rbac.hasFeatureFlagWriteAccess(featureFlag)) { + throw new UnauthorizedError(); + } + + // Compose and deploy the feature flag + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return compositionService.composeAndDeployFeatureFlag({ + actorId: authContext.userId, + featureFlag, + }); + }); + + const auditLogRepo = new AuditLogRepository(opts.db); + await auditLogRepo.addAuditLog({ + organizationId: authContext.organizationId, + organizationSlug: authContext.organizationSlug, + auditAction: 'feature_flag.recomposed', + action: 'recomposed', + actorId: authContext.userId, + auditableType: 'feature_flag', + auditableDisplayName: featureFlag.name, + actorDisplayName: authContext.userDisplayName, + apiKeyName: authContext.apiKeyName, + actorType: authContext.auth === 'api_key' ? 'api_key' : 'user', + targetNamespaceId: featureFlag.namespaceId, + targetNamespaceDisplayName: featureFlag.namespace, + }); + + // If req.limit is not provided, use maxRowLimitForChecks as default + const boundedLimit = req.limit === undefined ? maxRowLimitForChecks : clamp(req.limit, 1, maxRowLimitForChecks); + + const boundedDeploymentErrors = deploymentErrors.slice(0, boundedLimit); + const boundedCompositionErrors = compositionErrors.slice(0, boundedLimit); + const boundedCompositionWarnings = compositionWarnings.slice(0, boundedLimit); + + const errorCounts = { + compositionErrors: compositionErrors.length, + compositionWarnings: compositionWarnings.length, + deploymentErrors: deploymentErrors.length, + }; + + return { + response: { + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, + }, + deploymentErrors: boundedDeploymentErrors, + compositionErrors: boundedCompositionErrors, + compositionWarnings: boundedCompositionWarnings, + errorCounts, + }; + }); +} diff --git a/controlplane/src/core/bufservices/feature-flag/updateFeatureFlag.ts b/controlplane/src/core/bufservices/feature-flag/updateFeatureFlag.ts index a8e5c671da..1024fd81eb 100644 --- a/controlplane/src/core/bufservices/feature-flag/updateFeatureFlag.ts +++ b/controlplane/src/core/bufservices/feature-flag/updateFeatureFlag.ts @@ -1,24 +1,17 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, - DeploymentError, UpdateFeatureFlagRequest, UpdateFeatureFlagResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, FederatedGraphDTO } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; -import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidLabels } from '../../util.js'; -import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateFeatureFlag( opts: RouterOptions, @@ -33,14 +26,6 @@ export function updateFeatureFlag( const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - const orgWebhooks = new OrganizationWebhookService( - opts.db, - authContext.organizationId, - opts.logger, - opts.billingDefaultPlanId, - opts.webhookProxyUrl, - ); req.namespace = req.namespace || DefaultNamespace; @@ -111,140 +96,98 @@ export function updateFeatureFlag( }; } - const auditLogRepo = new AuditLogRepository(opts.db); - - const allFederatedGraphsToCompose: FederatedGraphDTO[] = []; - const allFederatedGraphIdsToCompose = new Set(); - const prevFederatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ featureFlagId: featureFlagDTO.id, namespaceId: namespace.id, excludeDisabled: true, }); - for (const prevFederatedGraph of prevFederatedGraphs) { - allFederatedGraphIdsToCompose.add(prevFederatedGraph.id); - allFederatedGraphsToCompose.push(prevFederatedGraph); - } - - await featureFlagRepo.updateFeatureFlag({ - featureFlag: featureFlagDTO, - labels: req.labels, - featureSubgraphIds, - unsetLabels: req.unsetLabels ?? false, - }); - - await auditLogRepo.addAuditLog({ - organizationId: authContext.organizationId, - organizationSlug: authContext.organizationSlug, - auditAction: 'feature_flag.updated', - action: 'updated', - actorId: authContext.userId, - auditableType: 'feature_flag', - auditableDisplayName: featureFlagDTO.name, - apiKeyName: authContext.apiKeyName, - actorDisplayName: authContext.userDisplayName, - actorType: authContext.auth === 'api_key' ? 'api_key' : 'user', - targetNamespaceId: namespace.id, - targetNamespaceDisplayName: namespace.name, - }); - - const newFederatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ - featureFlagId: featureFlagDTO.id, - namespaceId: namespace.id, - excludeDisabled: true, - }); - - for (const newFederatedGraph of newFederatedGraphs) { - if (allFederatedGraphIdsToCompose.has(newFederatedGraph.id)) { - continue; - } - allFederatedGraphsToCompose.push(newFederatedGraph); - } - - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs: allFederatedGraphsToCompose, - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); - }); - - for (const graph of allFederatedGraphsToCompose) { - const hasErrors = - compositionErrors.some((error) => error.federatedGraphName === graph.name) || - deploymentErrors.some((error) => error.federatedGraphName === graph.name); - orgWebhooks.send( - { - eventName: OrganizationEventName.FEDERATED_GRAPH_SCHEMA_UPDATED, - payload: { - federated_graph: { - id: graph.id, - name: graph.name, - namespace: graph.namespace, - }, - organization: { - id: authContext.organizationId, - slug: authContext.organizationSlug, - }, - errors: hasErrors, - actor_id: authContext.userId, - }, - }, - authContext.userId, - ); - } - - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - deploymentErrors: [], - compositionWarnings, - }; - } + const { deploymentErrors, compositionErrors, compositionWarnings, notFoundError } = await opts.db.transaction( + async (tx) => { + const txFeatureFlagRepo = new FeatureFlagRepository(logger, tx, authContext.organizationId); + await txFeatureFlagRepo.updateFeatureFlag({ + featureFlag: featureFlagDTO, + labels: req.labels, + featureSubgraphIds, + unsetLabels: req.unsetLabels ?? false, + }); + + const auditLogRepo = new AuditLogRepository(tx); + await auditLogRepo.addAuditLog({ + organizationId: authContext.organizationId, + organizationSlug: authContext.organizationSlug, + auditAction: 'feature_flag.updated', + action: 'updated', + actorId: authContext.userId, + auditableType: 'feature_flag', + auditableDisplayName: featureFlagDTO.name, + apiKeyName: authContext.apiKeyName, + actorDisplayName: authContext.userDisplayName, + actorType: authContext.auth === 'api_key' ? 'api_key' : 'user', + targetNamespaceId: namespace.id, + targetNamespaceDisplayName: namespace.name, + }); + + const updatedFeatureFlag = await txFeatureFlagRepo.getFeatureFlagById({ + featureFlagId: featureFlagDTO.id, + namespaceId: namespace.id, + includeSubgraphs: true, + }); + + if (!updatedFeatureFlag) { + return { + compositionErrors: [], + deploymentErrors: [], + compositionWarnings: [], + notFoundError: `Feature flag "${featureFlagDTO.name}" was not found after updating.`, + }; + } + + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + const compositionResult = await compositionService.composeAndDeployFeatureFlag({ + actorId: authContext.userId, + featureFlag: updatedFeatureFlag, + prevFederatedGraphs, + }); + + return { + deploymentErrors: compositionResult.deploymentErrors, + compositionErrors: compositionResult.compositionErrors, + compositionWarnings: compositionResult.compositionWarnings, + }; + }, + ); - if (deploymentErrors.length > 0) { + if (notFoundError) { return { response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, + code: EnumStatusCode.ERR_NOT_FOUND, + details: notFoundError, }, compositionErrors: [], - deploymentErrors, - compositionWarnings, + deploymentErrors: [], + compositionWarnings: [], }; } return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, deploymentErrors, diff --git a/controlplane/src/core/bufservices/federated-graph/createFederatedGraph.ts b/controlplane/src/core/bufservices/federated-graph/createFederatedGraph.ts index 771fd5419e..605743c38b 100644 --- a/controlplane/src/core/bufservices/federated-graph/createFederatedGraph.ts +++ b/controlplane/src/core/bufservices/federated-graph/createFederatedGraph.ts @@ -3,14 +3,10 @@ import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, CreateFederatedGraphRequest, CreateFederatedGraphResponse, - DeploymentError, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; @@ -20,6 +16,7 @@ import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidGraphName, isValidLabelMatchers } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function createFederatedGraph( opts: RouterOptions, @@ -130,14 +127,12 @@ export function createFederatedGraph( } const count = await fedGraphRepo.count(); - const feature = await orgRepo.getFeature({ organizationId: authContext.organizationId, featureId: 'federated-graphs', }); const limit = feature?.limit === -1 ? undefined : feature?.limit; - if (limit && count >= limit) { return { response: { @@ -212,37 +207,19 @@ export function createFederatedGraph( }; } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs: [federatedGraph], - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); + return compositionService.composeAndDeployFederatedGraph({ actorId: authContext.userId, federatedGraph }); }); orgWebhooks.send( @@ -265,34 +242,17 @@ export function createFederatedGraph( authContext.userId, ); - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - deploymentErrors: [], - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - compositionErrors: [], - deploymentErrors: [], + compositionErrors, + deploymentErrors, compositionWarnings, }; }); diff --git a/controlplane/src/core/bufservices/federated-graph/createFederatedGraphToken.ts b/controlplane/src/core/bufservices/federated-graph/createFederatedGraphToken.ts index 337a437f13..71e2bd0870 100644 --- a/controlplane/src/core/bufservices/federated-graph/createFederatedGraphToken.ts +++ b/controlplane/src/core/bufservices/federated-graph/createFederatedGraphToken.ts @@ -13,6 +13,7 @@ import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; export function createFederatedGraphToken( opts: RouterOptions, @@ -71,6 +72,17 @@ export function createFederatedGraphToken( }; } + const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); + const splitConfigFeature = await orgRepo.getFeature({ + organizationId: authContext.organizationId, + featureId: 'split-config-loading', + }); + + const features: string[] = []; + if (splitConfigFeature?.enabled) { + features.push('split-config-loading'); + } + const tokenValue = await signJwtHS256({ secret: opts.jwtSecret, token: { @@ -78,6 +90,7 @@ export function createFederatedGraphToken( federated_graph_id: graph.id, aud: audiences.cosmoGraphKey, // to distinguish from other tokens organization_id: authContext.organizationId, + features: features.length > 0 ? features : undefined, }, }); diff --git a/controlplane/src/core/bufservices/federated-graph/migrateFromApollo.ts b/controlplane/src/core/bufservices/federated-graph/migrateFromApollo.ts index 9b1934bbf4..b8e321e86f 100644 --- a/controlplane/src/core/bufservices/federated-graph/migrateFromApollo.ts +++ b/controlplane/src/core/bufservices/federated-graph/migrateFromApollo.ts @@ -6,7 +6,7 @@ import { MigrateFromApolloRequest, MigrateFromApolloResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, GraphApiKeyJwtPayload } from '../../../types/index.js'; +import { GraphApiKeyJwtPayload } from '../../../types/index.js'; import { audiences, signJwtHS256 } from '../../crypto/jwt.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; @@ -19,6 +19,7 @@ import ApolloMigrator from '../../services/ApolloMigrator.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function migrateFromApollo( opts: RouterOptions, @@ -77,7 +78,6 @@ export function migrateFromApollo( } const user = await userRepo.byId(authContext.userId || ''); - const apolloMigrator = new ApolloMigrator({ apiKey: req.apiKey, organizationSlug: org.slug, @@ -99,7 +99,6 @@ export function migrateFromApollo( } const graphDetails = await apolloMigrator.fetchGraphDetails({ graphID: graph.id }); - if (!graphDetails.success) { return { response: { @@ -132,14 +131,7 @@ export function migrateFromApollo( } } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - const federatedGraph = await apolloMigrator.migrateGraphFromApollo({ fedGraph: { name: graph.name, @@ -153,21 +145,18 @@ export function migrateFromApollo( namespaceId: namespace.id, }); - await fedGraphRepo.composeAndDeployGraphs({ - federatedGraphs: [federatedGraph], - actorId: authContext.userId, - blobStorage: opts.blobStorage, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: true, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - webhookProxyUrl: opts.webhookProxyUrl, - }); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + true, + ); + + await compositionService.composeAndDeployFederatedGraph({ actorId: authContext.userId, federatedGraph }); }); const migratedGraph = await fedGraphRepo.byName(graph.name, req.namespace); diff --git a/controlplane/src/core/bufservices/federated-graph/moveFederatedGraph.ts b/controlplane/src/core/bufservices/federated-graph/moveFederatedGraph.ts index 9a543561b1..0bb782f2bd 100644 --- a/controlplane/src/core/bufservices/federated-graph/moveFederatedGraph.ts +++ b/controlplane/src/core/bufservices/federated-graph/moveFederatedGraph.ts @@ -17,6 +17,7 @@ import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function moveFederatedGraph( opts: RouterOptions, @@ -113,6 +114,17 @@ export function moveFederatedGraph( throw new UnauthorizedError(); } + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + const { compositionErrors, deploymentErrors, compositionWarnings } = await fedGraphRepo.move( { targetId: graph.targetId, @@ -120,14 +132,7 @@ export function moveFederatedGraph( updatedBy: authContext.userId, federatedGraph: graph, }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - undefined, - opts.webhookProxyUrl, + compositionService, ); const allDeploymentErrors: PlainMessage[] = []; @@ -141,7 +146,6 @@ export function moveFederatedGraph( const movedGraphs = [graph]; const contracts = await contractRepo.bySourceFederatedGraphId(graph.id); - for (const contract of contracts) { const contractGraph = await fedGraphRepo.byId(contract.downstreamFederatedGraphId); if (!contractGraph) { @@ -160,14 +164,7 @@ export function moveFederatedGraph( federatedGraph: contractGraph, skipDeployment: compositionErrors.length > 0, }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - undefined, - opts.webhookProxyUrl, + compositionService, ); allCompositionErrors.push(...contractErrors); @@ -219,34 +216,17 @@ export function moveFederatedGraph( ); } - if (allCompositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - deploymentErrors: [], - compositionErrors: allCompositionErrors, - compositionWarnings: allCompositionWarnings, - }; - } - - if (allDeploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - deploymentErrors: allDeploymentErrors, - compositionErrors: [], - compositionWarnings: allCompositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + allCompositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : allDeploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - compositionErrors: [], - deploymentErrors: [], + compositionErrors: allCompositionErrors, + deploymentErrors: allDeploymentErrors, compositionWarnings: allCompositionWarnings, }; }); diff --git a/controlplane/src/core/bufservices/federated-graph/updateFederatedGraph.ts b/controlplane/src/core/bufservices/federated-graph/updateFederatedGraph.ts index dccc4106bf..375183dd9b 100644 --- a/controlplane/src/core/bufservices/federated-graph/updateFederatedGraph.ts +++ b/controlplane/src/core/bufservices/federated-graph/updateFederatedGraph.ts @@ -3,22 +3,18 @@ import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, - DeploymentError, UpdateFederatedGraphRequest, UpdateFederatedGraphResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidLabelMatchers } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateFederatedGraph( opts: RouterOptions, @@ -32,7 +28,6 @@ export function updateFederatedGraph( logger = enrichLogger(ctx, logger, authContext); const fedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const auditLogRepo = new AuditLogRepository(opts.db); const orgWebhooks = new OrganizationWebhookService( opts.db, @@ -110,50 +105,33 @@ export function updateFederatedGraph( }; } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const deploymentErrors: PlainMessage[] = []; - let compositionErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; + const result = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - const result = await fedGraphRepo.update({ - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - admissionWebhookSecret: req.admissionWebhookSecret, - admissionWebhookURL: req.admissionWebhookURL, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - labelMatchers: req.labelMatchers, - namespaceId: federatedGraph.namespaceId, - readme: req.readme, - routingUrl: req.routingUrl, - targetId: federatedGraph.targetId, - unsetLabelMatchers: req.unsetLabelMatchers, - updatedBy: authContext.userId, - webhookProxyUrl: opts.webhookProxyUrl, + const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); + return fedGraphRepo.update({ + compositionService, + admissionWebhookSecret: req.admissionWebhookSecret, + admissionWebhookURL: req.admissionWebhookURL, + labelMatchers: req.labelMatchers, + namespaceId: federatedGraph.namespaceId, + readme: req.readme, + routingUrl: req.routingUrl, + targetId: federatedGraph.targetId, + unsetLabelMatchers: req.unsetLabelMatchers, + updatedBy: authContext.userId, + }); }); - if (result?.deploymentErrors) { - deploymentErrors.push(...result.deploymentErrors); - } - - if (result?.compositionErrors) { - compositionErrors = result.compositionErrors; - } - - if (result?.compositionWarnings) { - compositionWarnings.push(...result.compositionWarnings); - } - await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, @@ -184,7 +162,7 @@ export function updateFederatedGraph( id: authContext.organizationId, slug: authContext.organizationSlug, }, - errors: compositionErrors.length > 0 || deploymentErrors.length > 0, + errors: result.compositionErrors.length > 0 || result.deploymentErrors.length > 0, actor_id: authContext.userId, }, }, @@ -192,35 +170,18 @@ export function updateFederatedGraph( ); } - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - deploymentErrors: [], - compositionErrors, - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - deploymentErrors, - compositionErrors: [], - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + result && result.compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : result && result.deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - compositionErrors: [], - deploymentErrors: [], - compositionWarnings, + compositionErrors: result?.compositionErrors || [], + deploymentErrors: result?.deploymentErrors || [], + compositionWarnings: result?.compositionWarnings || [], }; }); } diff --git a/controlplane/src/core/bufservices/graph/recomposeGraph.ts b/controlplane/src/core/bufservices/graph/recomposeGraph.ts index 88665d0dd0..656e3fd8f1 100644 --- a/controlplane/src/core/bufservices/graph/recomposeGraph.ts +++ b/controlplane/src/core/bufservices/graph/recomposeGraph.ts @@ -5,14 +5,14 @@ import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notificat import { RecomposeGraphRequest, RecomposeGraphResponse } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { clamp, enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; -import { AuthContext, COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, FederatedGraphDTO } from '../../../types/index.js'; +import { AuthContext, FederatedGraphDTO } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { maxRowLimitForChecks } from '../../constants.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function recomposeGraph( opts: RouterOptions, @@ -33,8 +33,6 @@ export function recomposeGraph( opts.webhookProxyUrl, ); const federatedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - if (authContext.organizationDeactivated) { throw new UnauthorizedError(); } @@ -69,30 +67,20 @@ export function recomposeGraph( authContext, }); - const ignoreExternalKeys = - ( - await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }) - )?.enabled ?? false; - - const { compositionErrors, compositionWarnings, deploymentErrors } = - await federatedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys, - }, - federatedGraphs: [graph], - webhookProxyUrl: opts.webhookProxyUrl, - }); + const { compositionErrors, compositionWarnings, deploymentErrors } = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return compositionService.composeAndDeployFederatedGraph({ actorId: authContext.userId, federatedGraph: graph }); + }); sendOrgWebhooks({ authContext, @@ -103,7 +91,6 @@ export function recomposeGraph( }); const auditLogRepo = new AuditLogRepository(opts.db); - await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, @@ -132,38 +119,19 @@ export function recomposeGraph( deploymentErrors: deploymentErrors.length, }; - if (boundedCompositionErrors.length > 0) { - return { - compositionErrors: boundedCompositionErrors, - compositionWarnings: boundedCompositionWarnings, - deploymentErrors: boundedDeploymentErrors, - errorCounts, - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - }; - } - - if (boundedDeploymentErrors.length > 0) { - return { - compositionErrors: [], - compositionWarnings: boundedCompositionWarnings, - deploymentErrors: boundedDeploymentErrors, - errorCounts, - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - }; - } - return { - compositionErrors: [], - compositionWarnings: boundedCompositionWarnings, - deploymentErrors: [], - errorCounts, response: { - code: EnumStatusCode.OK, + code: + boundedCompositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : boundedDeploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, + compositionErrors: boundedCompositionErrors, + compositionWarnings: boundedCompositionWarnings, + deploymentErrors: boundedDeploymentErrors, + errorCounts, }; }); } diff --git a/controlplane/src/core/bufservices/graph/setGraphRouterCompatibilityVersion.ts b/controlplane/src/core/bufservices/graph/setGraphRouterCompatibilityVersion.ts index 8b7cc66b4a..f7d28f03ca 100644 --- a/controlplane/src/core/bufservices/graph/setGraphRouterCompatibilityVersion.ts +++ b/controlplane/src/core/bufservices/graph/setGraphRouterCompatibilityVersion.ts @@ -6,15 +6,14 @@ import { SetGraphRouterCompatibilityVersionResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { ROUTER_COMPATIBILITY_VERSIONS, SupportedRouterCompatibilityVersion } from '@wundergraph/composition'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { SubgraphRepository } from '../../repositories/SubgraphRepository.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function setGraphRouterCompatibilityVersion( opts: RouterOptions, @@ -32,8 +31,6 @@ export function setGraphRouterCompatibilityVersion( } const fedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - req.namespace = req.namespace || DefaultNamespace; const federatedGraph = await fedGraphRepo.byName(req.name, req.namespace); @@ -100,6 +97,8 @@ export function setGraphRouterCompatibilityVersion( // If there are no subgraphs, we don't need to compose anything // and avoid producing a version with a composition error if (subgraphs.length === 0) { + const fedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); + await fedGraphRepo.updateRouterCompatibilityVersion(federatedGraph.id, version); return { response: { code: EnumStatusCode.OK, @@ -113,18 +112,11 @@ export function setGraphRouterCompatibilityVersion( }; } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - await opts.db.transaction(async (tx) => { + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - await fedGraphRepo.updateRouterCompatibilityVersion(federatedGraph.id, version); - const auditLogRepo = new AuditLogRepository(opts.db); - + const auditLogRepo = new AuditLogRepository(tx); await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, @@ -140,58 +132,37 @@ export function setGraphRouterCompatibilityVersion( targetNamespaceDisplayName: federatedGraph.namespace, }); - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs: [federatedGraph], - webhookProxyUrl: opts.webhookProxyUrl, - }); - - if (composition.compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - previousVersion: federatedGraph.routerCompatibilityVersion, - newVersion: federatedGraph.routerCompatibilityVersion, - compositionErrors: composition.compositionErrors, - compositionWarnings: composition.compositionWarnings, - deploymentErrors: composition.deploymentErrors, - }; - } - - if (composition.deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - previousVersion: federatedGraph.routerCompatibilityVersion, - newVersion: federatedGraph.routerCompatibilityVersion, - compositionErrors: composition.compositionErrors, - compositionWarnings: composition.compositionWarnings, - deploymentErrors: composition.deploymentErrors, - }; - } + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return await compositionService.composeAndDeployFederatedGraph({ actorId: authContext.userId, federatedGraph }); }); return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, previousVersion: federatedGraph.routerCompatibilityVersion, - newVersion: version, - compositionErrors: [], - compositionWarnings: [], - deploymentErrors: [], + newVersion: + compositionErrors.length > 0 || deploymentErrors.length > 0 + ? federatedGraph.routerCompatibilityVersion + : version, + compositionErrors, + compositionWarnings, + deploymentErrors, }; }); } diff --git a/controlplane/src/core/bufservices/monograph/publishMonograph.ts b/controlplane/src/core/bufservices/monograph/publishMonograph.ts index fb77261cad..ed292099f2 100644 --- a/controlplane/src/core/bufservices/monograph/publishMonograph.ts +++ b/controlplane/src/core/bufservices/monograph/publishMonograph.ts @@ -15,6 +15,7 @@ import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function publishMonograph( opts: RouterOptions, @@ -139,26 +140,33 @@ export function publishMonograph( authContext, }); - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings } = - await subgraphRepo.update( - { - targetId: subgraphs[0].targetId, - labels: [], - unsetLabels: false, - schemaSDL: subgraphSchemaSDL, - updatedBy: authContext.userId, - namespaceId: namespace.id, - isV2Graph, - }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - undefined, - opts.webhookProxyUrl, - ); + const { deploymentErrors, compositionErrors, compositionWarnings, updatedFederatedGraphs } = + await opts.db.transaction((tx) => { + const subgraphRepo = new SubgraphRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + false, + ); + + return subgraphRepo.update( + { + targetId: subgraphs[0].targetId, + labels: [], + unsetLabels: false, + schemaSDL: subgraphSchemaSDL, + updatedBy: authContext.userId, + namespaceId: namespace.id, + isV2Graph, + }, + compositionService, + ); + }); for (const graph of updatedFederatedGraphs) { orgWebhooks.send( diff --git a/controlplane/src/core/bufservices/monograph/updateMonograph.ts b/controlplane/src/core/bufservices/monograph/updateMonograph.ts index a41eb51be5..cee8113a1f 100644 --- a/controlplane/src/core/bufservices/monograph/updateMonograph.ts +++ b/controlplane/src/core/bufservices/monograph/updateMonograph.ts @@ -21,6 +21,7 @@ import { } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateMonograph( opts: RouterOptions, @@ -135,25 +136,32 @@ export function updateMonograph( authContext, }); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient!, + opts.webhookProxyUrl, + false, + ); + + // Update the federated graph await fedGraphRepo.update({ + compositionService, targetId: graph.targetId, labelMatchers: [], routingUrl: req.routingUrl, updatedBy: authContext.userId, readme: req.readme, - blobStorage: opts.blobStorage, namespaceId: graph.namespaceId, unsetLabelMatchers: false, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, admissionWebhookURL: req.admissionWebhookURL, admissionWebhookSecret: req.admissionWebhookSecret, - chClient: opts.chClient!, - webhookProxyUrl: opts.webhookProxyUrl, }); + // Update the subgraph await subgraphRepo.update( { targetId: subgraph.targetId, @@ -169,14 +177,7 @@ export function updateMonograph( readme: req.readme, namespaceId: subgraph.namespaceId, }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - undefined, - opts.webhookProxyUrl, + compositionService, ); await auditLogRepo.addAuditLog({ diff --git a/controlplane/src/core/bufservices/subgraph/deleteFederatedSubgraph.ts b/controlplane/src/core/bufservices/subgraph/deleteFederatedSubgraph.ts index 68addc14ec..5f7ed057c4 100644 --- a/controlplane/src/core/bufservices/subgraph/deleteFederatedSubgraph.ts +++ b/controlplane/src/core/bufservices/subgraph/deleteFederatedSubgraph.ts @@ -6,18 +6,18 @@ import { DeleteFederatedSubgraphRequest, DeleteFederatedSubgraphResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; +import { FeatureFlagDTO } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import { SubgraphRepository } from '../../repositories/SubgraphRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getFederatedGraphRouterCompatibilityVersion, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { ProposalRepository } from '../../repositories/ProposalRepository.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function deleteFederatedSubgraph( opts: RouterOptions, @@ -34,7 +34,6 @@ export function deleteFederatedSubgraph( const proposalRepo = new ProposalRepository(opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); const fedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const orgWebhooks = new OrganizationWebhookService( opts.db, authContext.organizationId, @@ -125,11 +124,6 @@ export function deleteFederatedSubgraph( } } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - const { affectedFederatedGraphs, compositionErrors, deploymentErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); @@ -137,11 +131,29 @@ export function deleteFederatedSubgraph( const featureFlagRepo = new FeatureFlagRepository(logger, tx, authContext.organizationId); const auditLogRepo = new AuditLogRepository(tx); + const affectedFeatureFlags: FeatureFlagDTO[] = []; + let labels = subgraph.labels; if (subgraph.isFeatureSubgraph) { const baseSubgraph = await featureFlagRepo.getBaseSubgraphByFeatureSubgraphId({ id: subgraph.id }); if (baseSubgraph) { labels = baseSubgraph.labels; + const enabledFeatureFlags = await featureFlagRepo.getFeatureFlagsByBaseSubgraphId({ + baseSubgraphId: baseSubgraph.id, + namespaceId: namespace.id, + excludeDisabled: true, + }); + + for (const enabledFeatureFlag of enabledFeatureFlags) { + const featureFlag = await featureFlagRepo.getFeatureFlagById({ + featureFlagId: enabledFeatureFlag.id, + namespaceId: namespace.id, + }); + + if (featureFlag) { + affectedFeatureFlags.push(featureFlag); + } + } } } else { await featureFlagRepo.deleteFeatureSubgraphsByBaseSubgraphId({ @@ -177,21 +189,32 @@ export function deleteFederatedSubgraph( // Recompose and deploy all affected federated graphs and their respective contracts. // Collects all composition and deployment errors if any. - const { compositionErrors, deploymentErrors, compositionWarnings } = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - webhookJWTSecret: opts.admissionWebhookJWTSecret, - cdnBaseUrl: opts.cdnBaseUrl, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs: affectedFederatedGraphs, - webhookProxyUrl: opts.webhookProxyUrl, - }); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + if (subgraph.isFeatureSubgraph) { + // To avoid having to re-fetch the feature flags for v2, we are just going to update the feature flag + // reference to remove the deleted feature subgraph, that way, we have an up-to-date view of the feature flag + for (const featureFlag of affectedFeatureFlags) { + featureFlag.featureSubgraphs = featureFlag.featureSubgraphs.filter((fs) => fs.id !== subgraph.id); + } + } + + const { deploymentErrors, compositionErrors, compositionWarnings } = + await compositionService.recomposeAndDeployAffected({ + actorId: authContext.userId, + affectedFederatedGraphs, + affectedFeatureFlags, + isFeatureSubgraph: subgraph.isFeatureSubgraph, + }); // Re-fetch the federated graphs to get the updated composedSchemaVersionId const refreshedGraphs = await Promise.all(affectedFederatedGraphs.map((g) => fedGraphRepo.byId(g.id))); @@ -289,36 +312,17 @@ export function deleteFederatedSubgraph( } } - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - deploymentErrors: [], - compositionErrors, - compositionWarnings, - proposalMatchMessage, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - deploymentErrors, - compositionErrors: [], - compositionWarnings, - proposalMatchMessage, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - deploymentErrors: [], - compositionErrors: [], + deploymentErrors, + compositionErrors, compositionWarnings, proposalMatchMessage, }; diff --git a/controlplane/src/core/bufservices/subgraph/moveSubgraph.ts b/controlplane/src/core/bufservices/subgraph/moveSubgraph.ts index bb44085e68..2405bc5148 100644 --- a/controlplane/src/core/bufservices/subgraph/moveSubgraph.ts +++ b/controlplane/src/core/bufservices/subgraph/moveSubgraph.ts @@ -3,16 +3,15 @@ import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { MoveGraphRequest, MoveGraphResponse } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { PublicError } from '../../errors/errors.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; import { NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import { SubgraphRepository } from '../../repositories/SubgraphRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function moveSubgraph( opts: RouterOptions, @@ -27,7 +26,6 @@ export function moveSubgraph( const subgraphRepo = new SubgraphRepository(logger, opts.db, authContext.organizationId); const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const orgWebhooks = new OrganizationWebhookService( opts.db, authContext.organizationId, @@ -86,11 +84,6 @@ export function moveSubgraph( authContext, }); - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { const auditLogRepo = new AuditLogRepository(tx); @@ -110,7 +103,18 @@ export function moveSubgraph( throw new PublicError(EnumStatusCode.ERR_NOT_FOUND, `Could not find namespace ${req.newNamespace}`); } - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings } = + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + const { deploymentErrors, compositionErrors, compositionWarnings, updatedFederatedGraphs } = await subgraphRepo.move( { currentNamespaceId: subgraph.namespaceId, @@ -120,17 +124,7 @@ export function moveSubgraph( targetId: subgraph.targetId, updatedBy: authContext.userId, }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - opts.webhookProxyUrl, + compositionService, ); await auditLogRepo.addAuditLog({ diff --git a/controlplane/src/core/bufservices/subgraph/publishFederatedSubgraph.ts b/controlplane/src/core/bufservices/subgraph/publishFederatedSubgraph.ts index 3b8b71fb81..59ca3c36e7 100644 --- a/controlplane/src/core/bufservices/subgraph/publishFederatedSubgraph.ts +++ b/controlplane/src/core/bufservices/subgraph/publishFederatedSubgraph.ts @@ -9,7 +9,6 @@ import { } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; import { maxRowLimitForChecks } from '../../constants.js'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { buildSchema } from '../../composition/composition.js'; import { UnauthorizedError } from '../../errors/errors.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; @@ -37,6 +36,7 @@ import { isValidPluginVersion, } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function publishFederatedSubgraph( opts: RouterOptions, @@ -72,11 +72,6 @@ export function publishFederatedSubgraph( throw new UnauthorizedError(); } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - const subgraphSchemaSDL = req.schema; const namespace = await namespaceRepo.byName(req.namespace); if (!namespace) { @@ -566,47 +561,51 @@ export function publishFederatedSubgraph( } } - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, subgraphChanged, compositionWarnings } = - await subgraphRepo.update( - { - targetId: subgraph.targetId, - labels: subgraph.labels, - unsetLabels: false, - schemaSDL: subgraphSchemaSDL, - updatedBy: authContext.userId, - namespaceId: namespace.id, - isV2Graph, - proto: - subgraph.type === 'grpc_plugin' - ? { - schema: req.proto?.schema || '', - mappings: req.proto?.mappings || '', - lock: req.proto?.lock || '', - pluginData: { - platforms: req.proto?.platforms || [], - version: req.proto?.version || '', - }, - } - : subgraph.type === 'grpc_service' + const { deploymentErrors, compositionErrors, compositionWarnings, updatedFederatedGraphs, subgraphChanged } = + await opts.db.transaction((tx) => { + const subgraphRepo = new SubgraphRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return subgraphRepo.update( + { + targetId: subgraph.targetId, + labels: subgraph.labels, + unsetLabels: false, + schemaSDL: subgraphSchemaSDL, + updatedBy: authContext.userId, + namespaceId: namespace.id, + isV2Graph, + proto: + subgraph.type === 'grpc_plugin' ? { schema: req.proto?.schema || '', mappings: req.proto?.mappings || '', lock: req.proto?.lock || '', + pluginData: { + platforms: req.proto?.platforms || [], + version: req.proto?.version || '', + }, } - : undefined, - }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - opts.webhookProxyUrl, - ); + : subgraph.type === 'grpc_service' + ? { + schema: req.proto?.schema || '', + mappings: req.proto?.mappings || '', + lock: req.proto?.lock || '', + } + : undefined, + }, + compositionService, + ); + }); // if this subgraph is part of a proposal, mark the proposal subgraph as published // and if all proposal subgraphs are published, collect proposal details for the webhook @@ -756,38 +755,17 @@ export function publishFederatedSubgraph( deploymentErrors: deploymentErrors.length, }; - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors: boundedCompositionErrors, - compositionWarnings: boundedCompositionWarnings, - deploymentErrors: [], - proposalMatchMessage, - counts, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors: boundedDeploymentErrors, - compositionWarnings: boundedCompositionWarnings, - proposalMatchMessage, - counts, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - compositionErrors: [], - deploymentErrors: [], + deploymentErrors: boundedDeploymentErrors, + compositionErrors: boundedCompositionErrors, hasChanged: subgraphChanged, compositionWarnings: boundedCompositionWarnings, proposalMatchMessage, diff --git a/controlplane/src/core/bufservices/subgraph/updateSubgraph.ts b/controlplane/src/core/bufservices/subgraph/updateSubgraph.ts index 5849b4b211..f0124d8f4d 100644 --- a/controlplane/src/core/bufservices/subgraph/updateSubgraph.ts +++ b/controlplane/src/core/bufservices/subgraph/updateSubgraph.ts @@ -8,10 +8,8 @@ import { UpdateSubgraphResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import { SubgraphRepository } from '../../repositories/SubgraphRepository.js'; import type { RouterOptions } from '../../routes.js'; import { @@ -26,6 +24,7 @@ import { } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateSubgraph( opts: RouterOptions, @@ -39,7 +38,6 @@ export function updateSubgraph( logger = enrichLogger(ctx, logger, authContext); const subgraphRepo = new SubgraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const auditLogRepo = new AuditLogRepository(opts.db); const orgWebhooks = new OrganizationWebhookService( opts.db, @@ -189,39 +187,38 @@ export function updateSubgraph( throw new UnauthorizedError(); } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); + const { deploymentErrors, compositionErrors, compositionWarnings, updatedFederatedGraphs } = + await opts.db.transaction((tx) => { + const subgraphRepo = new SubgraphRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings } = - await subgraphRepo.update( - { - targetId: subgraph.targetId, - labels: req.labels, - unsetLabels: req.unsetLabels ?? false, - subscriptionUrl: req.subscriptionUrl, - routingUrl: req.routingUrl, - subscriptionProtocol: - req.subscriptionProtocol === undefined ? undefined : formatSubscriptionProtocol(req.subscriptionProtocol), - websocketSubprotocol: - req.websocketSubprotocol === undefined ? undefined : formatWebsocketSubprotocol(req.websocketSubprotocol), - updatedBy: authContext.userId, - readme: req.readme, - namespaceId: subgraph.namespaceId, - }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - opts.webhookProxyUrl, - ); + return subgraphRepo.update( + { + targetId: subgraph.targetId, + labels: req.labels, + unsetLabels: req.unsetLabels ?? false, + subscriptionUrl: req.subscriptionUrl, + routingUrl: req.routingUrl, + subscriptionProtocol: + req.subscriptionProtocol === undefined ? undefined : formatSubscriptionProtocol(req.subscriptionProtocol), + websocketSubprotocol: + req.websocketSubprotocol === undefined ? undefined : formatWebsocketSubprotocol(req.websocketSubprotocol), + updatedBy: authContext.userId, + readme: req.readme, + namespaceId: subgraph.namespaceId, + }, + compositionService, + ); + }); await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, diff --git a/controlplane/src/core/composition/composer.ts b/controlplane/src/core/composition/composer.ts index 50056960f2..24f5d5c8f8 100644 --- a/controlplane/src/core/composition/composer.ts +++ b/controlplane/src/core/composition/composer.ts @@ -51,6 +51,7 @@ export function getRouterCompatibilityVersionPath(routerCompatibilityVersion: st } } } + export type CompositionResult = { compositions: DeserializedComposedGraph[]; }; @@ -137,6 +138,7 @@ export type CheckSubgraph = { // will be used only for new subgraphs labels?: Label[]; }; + @traced export class Composer { constructor( @@ -195,6 +197,7 @@ export class Composer { admissionWebhookSecret, actorId, routerCompatibilityVersion, + pathOverride, }: { routerConfig: RouterConfig; blobStorage: BlobStorage; @@ -209,28 +212,38 @@ export class Composer { admissionWebhookSecret?: string; actorId: string; routerCompatibilityVersion: string; + pathOverride?: { ready: string; draft: string }; }): Promise<{ errors: ComposeDeploymentError[]; }> { const routerConfigJsonStringBytes = Buffer.from(routerConfig.toJsonString(), 'utf8'); const errors: ComposeDeploymentError[] = []; - let versionPath = ''; - if (routerCompatibilityVersion !== ROUTER_COMPATIBILITY_VERSION_ONE) { - if (ROUTER_COMPATIBILITY_VERSIONS.has(routerCompatibilityVersion as SupportedRouterCompatibilityVersion)) { - versionPath = `${routerCompatibilityVersion}/`; - } else { - errors.push( - new RouterConfigUploadError(`Invalid router compatibility version "${routerCompatibilityVersion}".`), - ); - return { - errors, - }; + let s3PathDraft: string; + let s3PathReady: string; + + if (pathOverride?.ready && pathOverride?.draft) { + s3PathDraft = pathOverride.draft; + s3PathReady = pathOverride.ready; + } else { + let versionPath = ''; + if (routerCompatibilityVersion !== ROUTER_COMPATIBILITY_VERSION_ONE) { + if (ROUTER_COMPATIBILITY_VERSIONS.has(routerCompatibilityVersion as SupportedRouterCompatibilityVersion)) { + versionPath = `${routerCompatibilityVersion}/`; + } else { + errors.push( + new RouterConfigUploadError(`Invalid router compatibility version "${routerCompatibilityVersion}".`), + ); + return { + errors, + }; + } } + + // CDN path and bucket path are the same in this case + s3PathDraft = `${organizationId}/${federatedGraphId}/routerconfigs/draft.json`; + s3PathReady = `${organizationId}/${federatedGraphId}/routerconfigs/${versionPath}latest.json`; } - // CDN path and bucket path are the same in this case - const s3PathDraft = `${organizationId}/${federatedGraphId}/routerconfigs/draft.json`; - const s3PathReady = `${organizationId}/${federatedGraphId}/routerconfigs/${versionPath}latest.json`; // The signature will be added by the admission webhook let signatureSha256: undefined | string; @@ -357,6 +370,7 @@ export class Composer { federatedGraphAdmissionWebhookURL, federatedGraphAdmissionWebhookSecret, actorId, + pathOverride, }: { admissionConfig: { jwtSecret: string; @@ -371,6 +385,7 @@ export class Composer { federatedGraphAdmissionWebhookURL?: string; federatedGraphAdmissionWebhookSecret?: string; actorId: string; + pathOverride?: { ready: string; draft: string }; }) { const baseRouterConfig = this.composeRouterConfigWithFeatureFlags({ featureFlagRouterExecutionConfigByFeatureFlagName, @@ -409,6 +424,7 @@ export class Composer { }, actorId, routerCompatibilityVersion: federatedGraph.routerCompatibilityVersion, + pathOverride, }); return { diff --git a/controlplane/src/core/repositories/FeatureFlagRepository.ts b/controlplane/src/core/repositories/FeatureFlagRepository.ts index 921a027388..e7033f541b 100644 --- a/controlplane/src/core/repositories/FeatureFlagRepository.ts +++ b/controlplane/src/core/repositories/FeatureFlagRepository.ts @@ -734,16 +734,16 @@ export class FeatureFlagRepository { includeContracts?: boolean; }): Promise { const federatedGraphs: FederatedGraphDTO[] = []; - const featureSubraphsOfFeatureFlag = await this.getFeatureSubgraphsByFeatureFlagId({ + const featureSubgraphsOfFeatureFlag = await this.getFeatureSubgraphsByFeatureFlagId({ featureFlagId, namespaceId, }); - if (featureSubraphsOfFeatureFlag.length === 0) { + if (featureSubgraphsOfFeatureFlag.length === 0) { return []; } - const baseSubgraphIds = featureSubraphsOfFeatureFlag.map((f) => f.baseSubgraphId); + const baseSubgraphIds = featureSubgraphsOfFeatureFlag.map((f) => f.baseSubgraphId); - // fetches the federated graphs which contains all the base subgraphs of the feature subgraphs + // fetches the federated graphs which contain all the base subgraphs of the feature subgraphs const federatedGraphIds = await this.db .select({ federatedGraphId: subgraphsToFederatedGraph.federatedGraphId, @@ -1042,6 +1042,7 @@ export class FeatureFlagRepository { } const baseSubgraphNamesOfFeatureFlags = featureSubgraphsByFlag.map((ff) => ff.baseSubgraphName); + // check if all base subgraphs of feature flags are one of the base subgraphs of this composition const isSubset = baseSubgraphNamesOfFeatureFlags.every((name) => baseSubgraphNames.includes(name)); if (!isSubset) { @@ -1124,6 +1125,7 @@ export class FeatureFlagRepository { baseSubgraphNames: baseCompositionSubgraphs.map((baseSubgraph) => baseSubgraph.name), excludeDisabled: true, }); + for (const flag of enabledFeatureFlags) { if (featureFlagToComposeByFlagId.has(flag.id)) { continue; diff --git a/controlplane/src/core/repositories/FederatedGraphRepository.ts b/controlplane/src/core/repositories/FederatedGraphRepository.ts index d04d57ae25..e749d9dfc6 100644 --- a/controlplane/src/core/repositories/FederatedGraphRepository.ts +++ b/controlplane/src/core/repositories/FederatedGraphRepository.ts @@ -53,6 +53,7 @@ import { GraphApiKeyDTO, Label, RouterRequestKeysDTO, + ComposeAndDeployResult, } from '../../types/index.js'; import { BlobStorage } from '../blobstorage/index.js'; import { @@ -75,6 +76,7 @@ import { unsuccessfulBaseCompositionError } from '../errors/errors.js'; import { ClickHouseClient } from '../clickhouse/index.js'; import { RBACEvaluator } from '../services/RBACEvaluator.js'; import { traced } from '../tracing.js'; +import type { CompositionService } from '../services/CompositionService.js'; import { ContractRepository } from './ContractRepository.js'; import { FeatureFlagRepository, SubgraphsToCompose } from './FeatureFlagRepository.js'; import { GraphCompositionRepository } from './GraphCompositionRepository.js'; @@ -187,160 +189,137 @@ export class FederatedGraphRepository { }); } - public update(data: { - admissionConfig: { - jwtSecret: string; - cdnBaseUrl: string; - }; - blobStorage: BlobStorage; + public async update({ + compositionService, + ...data + }: { + compositionService: CompositionService; labelMatchers: string[]; namespaceId: string; routingUrl: string; targetId: string; updatedBy: string; - chClient: ClickHouseClient; admissionWebhookSecret?: string; admissionWebhookURL?: string; - compositionOptions?: CompositionOptions; readme?: string; - unsetAdmissionWebhookURL?: boolean; unsetLabelMatchers?: boolean; - webhookProxyUrl?: string; - }): Promise< - | { - compositionErrors: PlainMessage[]; - deploymentErrors: PlainMessage[]; - compositionWarnings: PlainMessage[]; - } - | undefined - > { + }): Promise { const routingUrl = normalizeURL(data.routingUrl); - return this.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(this.logger, tx, this.organizationId); - const subgraphRepo = new SubgraphRepository(this.logger, tx, this.organizationId); - const targetRepo = new TargetRepository(tx, this.organizationId); - const contractRepo = new ContractRepository(this.logger, tx, this.organizationId); - - const federatedGraph = await fedGraphRepo.byTargetId(data.targetId); - if (!federatedGraph) { - throw new Error(`Federated graph not found`); - } - - // Update routing URL when changed. (Is required) - if (routingUrl && federatedGraph.routingUrl !== routingUrl) { - await tx.update(federatedGraphs).set({ routingUrl }).where(eq(federatedGraphs.id, federatedGraph.id)).execute(); - } - - // Update admission webhook URL when changed. (Is optional) - if (data.admissionWebhookURL !== undefined && federatedGraph.admissionWebhookURL !== data.admissionWebhookURL) { - const admissionWebhookURL = data.admissionWebhookURL ? normalizeURL(data.admissionWebhookURL) : ''; - - await tx - .update(federatedGraphs) - .set({ admissionWebhookURL: admissionWebhookURL || null }) - .where(eq(federatedGraphs.id, federatedGraph.id)) - .execute(); - } + const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); + const targetRepo = new TargetRepository(this.db, this.organizationId); + const contractRepo = new ContractRepository(this.logger, this.db, this.organizationId); + + const federatedGraph = await fedGraphRepo.byTargetId(data.targetId); + if (!federatedGraph) { + throw new Error(`Federated graph not found`); + } - if (data.admissionWebhookSecret !== undefined) { - await tx - .update(federatedGraphs) - .set({ admissionWebhookSecret: data.admissionWebhookSecret || null }) - .where(eq(federatedGraphs.id, federatedGraph.id)) - .execute(); - } + // Update routing URL when changed. (Is required) + if (routingUrl && federatedGraph.routingUrl !== routingUrl) { + await this.db + .update(federatedGraphs) + .set({ routingUrl }) + .where(eq(federatedGraphs.id, federatedGraph.id)) + .execute(); + } - // Update the readme of the fed graph. (Is optional) - if (data.readme !== undefined) { - await targetRepo.updateReadmeOfTarget({ id: data.targetId, readme: data.readme }); - } + // Update admission webhook URL when changed. (Is optional) + if (data.admissionWebhookURL !== undefined && federatedGraph.admissionWebhookURL !== data.admissionWebhookURL) { + const admissionWebhookURL = data.admissionWebhookURL ? normalizeURL(data.admissionWebhookURL) : ''; - const haveLabelMatchersChanged = checkIfLabelMatchersChanged({ - isContract: !!federatedGraph.contract, - currentLabelMatchers: federatedGraph.labelMatchers, - newLabelMatchers: data.labelMatchers, - unsetLabelMatchers: data.unsetLabelMatchers, - }); + await this.db + .update(federatedGraphs) + .set({ admissionWebhookURL: admissionWebhookURL || null }) + .where(eq(federatedGraphs.id, federatedGraph.id)) + .execute(); + } - // Update label matchers (Is optional) - if (haveLabelMatchersChanged) { - const labelMatchers = data.unsetLabelMatchers ? [] : normalizeLabelMatchers(data.labelMatchers); + if (data.admissionWebhookSecret !== undefined) { + await this.db + .update(federatedGraphs) + .set({ admissionWebhookSecret: data.admissionWebhookSecret || null }) + .where(eq(federatedGraphs.id, federatedGraph.id)) + .execute(); + } - const contracts = await contractRepo.bySourceFederatedGraphId(federatedGraph.id); + // Update the readme of the fed graph. (Is optional) + if (data.readme !== undefined) { + await targetRepo.updateReadmeOfTarget({ id: data.targetId, readme: data.readme }); + } - const subgraphs = await subgraphRepo.byGraphLabelMatchers({ - labelMatchers, - namespaceId: data.namespaceId, - }); + const haveLabelMatchersChanged = checkIfLabelMatchersChanged({ + isContract: !!federatedGraph.contract, + currentLabelMatchers: federatedGraph.labelMatchers, + newLabelMatchers: data.labelMatchers, + unsetLabelMatchers: data.unsetLabelMatchers, + }); - const graphAndContracts = [federatedGraph, ...contracts.map((c) => c.downstreamFederatedGraph)]; + // Update label matchers (Is optional) + if (!haveLabelMatchersChanged) { + return undefined; + } - for (const graph of graphAndContracts) { - await tx.delete(schema.targetLabelMatchers).where(eq(schema.targetLabelMatchers.targetId, graph.targetId)); + const labelMatchers = data.unsetLabelMatchers ? [] : normalizeLabelMatchers(data.labelMatchers); + const contracts = await contractRepo.bySourceFederatedGraphId(federatedGraph.id); + const subgraphs = await subgraphRepo.byGraphLabelMatchers({ + labelMatchers, + namespaceId: data.namespaceId, + }); - if (labelMatchers.length > 0) { - await tx - .insert(schema.targetLabelMatchers) - .values( - labelMatchers.map((labelMatcher) => ({ - targetId: graph.targetId, - labelMatcher: labelMatcher.split(','), - })), - ) - .execute(); - } + const graphAndContracts = [federatedGraph, ...contracts.map((c) => c.downstreamFederatedGraph)]; + for (const graph of graphAndContracts) { + await this.db.delete(schema.targetLabelMatchers).where(eq(schema.targetLabelMatchers.targetId, graph.targetId)); - let deleteCondition: SQL | undefined = eq( - schema.subgraphsToFederatedGraph.federatedGraphId, - graph.id, - ); + if (labelMatchers.length > 0) { + await this.db + .insert(schema.targetLabelMatchers) + .values( + labelMatchers.map((labelMatcher) => ({ + targetId: graph.targetId, + labelMatcher: labelMatcher.split(','), + })), + ) + .execute(); + } - // we do this conditionally because notInArray cannot take empty value - if (subgraphs.length > 0) { - deleteCondition = and( - deleteCondition, - notInArray( - schema.subgraphsToFederatedGraph.subgraphId, - subgraphs.map((subgraph) => subgraph.id), - ), - ); - } + let deleteCondition: SQL | undefined = eq(schema.subgraphsToFederatedGraph.federatedGraphId, graph.id); - await tx.delete(schema.subgraphsToFederatedGraph).where(deleteCondition); + // we do this conditionally because notInArray cannot take empty value + if (subgraphs.length > 0) { + deleteCondition = and( + deleteCondition, + notInArray( + schema.subgraphsToFederatedGraph.subgraphId, + subgraphs.map((subgraph) => subgraph.id), + ), + ); + } - if (subgraphs.length > 0) { - await tx - .insert(schema.subgraphsToFederatedGraph) - .values( - subgraphs.map((sg) => ({ - subgraphId: sg.id, - federatedGraphId: graph.id, - })), - ) - .onConflictDoNothing() - .execute(); - } - } + await this.db.delete(schema.subgraphsToFederatedGraph).where(deleteCondition); + if (subgraphs.length > 0) { + await this.db + .insert(schema.subgraphsToFederatedGraph) + .values( + subgraphs.map((sg) => ({ + subgraphId: sg.id, + federatedGraphId: graph.id, + })), + ) + .onConflictDoNothing() + .execute(); + } + } - const { compositionErrors, deploymentErrors, compositionWarnings } = await fedGraphRepo.composeAndDeployGraphs({ - federatedGraphs: [federatedGraph], - blobStorage: data.blobStorage, - admissionConfig: { - webhookJWTSecret: data.admissionConfig.jwtSecret, - cdnBaseUrl: data.admissionConfig.cdnBaseUrl, - }, - actorId: data.updatedBy, - chClient: data.chClient, - compositionOptions: data.compositionOptions, - webhookProxyUrl: data.webhookProxyUrl, - }); + // since the label matchers have changed, the current DTO is stale + const updatedFederatedGraph = await fedGraphRepo.byTargetId(data.targetId); + if (!updatedFederatedGraph) { + throw new Error(`Federated graph not found`); + } - return { - compositionErrors, - deploymentErrors, - compositionWarnings, - }; - } + return await compositionService.composeAndDeployFederatedGraph({ + actorId: data.updatedBy, + federatedGraph: updatedFederatedGraph, }); } @@ -351,7 +330,7 @@ export class FederatedGraphRepository { .where(and(eq(targets.id, targetId), eq(schema.targets.organizationId, this.organizationId))); } - public move( + public async move( data: { targetId: string; newNamespaceId: string; @@ -359,102 +338,61 @@ export class FederatedGraphRepository { federatedGraph: FederatedGraphDTO; skipDeployment?: boolean; }, - blobStorage: BlobStorage, - admissionConfig: { - jwtSecret: string; - cdnBaseUrl: string; - }, - chClient: ClickHouseClient, - compositionOptions?: CompositionOptions, - webhookProxyUrl?: string, - ): Promise<{ - compositionErrors: PlainMessage[]; - deploymentErrors: PlainMessage[]; - compositionWarnings: PlainMessage[]; - }> { - return this.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(this.logger, tx, this.organizationId); - const subgraphRepo = new SubgraphRepository(this.logger, tx, this.organizationId); - - await tx.update(targets).set({ namespaceId: data.newNamespaceId }).where(eq(targets.id, data.targetId)); - - // Delete all mappings because we will deal with new subgraphs in new namespace - await tx - .delete(schema.subgraphsToFederatedGraph) - .where(eq(schema.subgraphsToFederatedGraph.federatedGraphId, data.federatedGraph.id)); + compositionService: CompositionService, + ): Promise { + const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); - const newNamespaceSubgraphs = await subgraphRepo.byGraphLabelMatchers({ - labelMatchers: data.federatedGraph.labelMatchers, - namespaceId: data.newNamespaceId, - }); + await this.db.update(targets).set({ namespaceId: data.newNamespaceId }).where(eq(targets.id, data.targetId)); - // insert new mappings - if (newNamespaceSubgraphs.length > 0) { - await tx - .insert(schema.subgraphsToFederatedGraph) - .values( - newNamespaceSubgraphs.map((sg) => ({ - subgraphId: sg.id, - federatedGraphId: data.federatedGraph.id, - })), - ) - .onConflictDoNothing() - .execute(); - } + // Delete all mappings because we will deal with new subgraphs in new namespace + await this.db + .delete(schema.subgraphsToFederatedGraph) + .where(eq(schema.subgraphsToFederatedGraph.federatedGraphId, data.federatedGraph.id)); - if (data.skipDeployment) { - return { - compositionErrors: [], - deploymentErrors: [], - compositionWarnings: [], - }; - } + const newNamespaceSubgraphs = await subgraphRepo.byGraphLabelMatchers({ + labelMatchers: data.federatedGraph.labelMatchers, + namespaceId: data.newNamespaceId, + }); - // Handle Contract Deployment - if (data.federatedGraph.contract) { - const movedContractGraph = await fedGraphRepo.byId(data.federatedGraph.id); - if (!movedContractGraph) { - throw new Error('Could not find contract after moving'); - } + // insert new mappings + if (newNamespaceSubgraphs.length > 0) { + await this.db + .insert(schema.subgraphsToFederatedGraph) + .values( + newNamespaceSubgraphs.map((sg) => ({ + subgraphId: sg.id, + federatedGraphId: data.federatedGraph.id, + })), + ) + .onConflictDoNothing() + .execute(); + } - const composition = await this.composeAndDeployGraphs({ - actorId: data.updatedBy, - admissionConfig: { - cdnBaseUrl: admissionConfig.cdnBaseUrl, - webhookJWTSecret: admissionConfig.jwtSecret, - }, - blobStorage, - chClient, - compositionOptions, - federatedGraphs: [movedContractGraph], - webhookProxyUrl, - }); + if (data.skipDeployment) { + return { + compositionErrors: [], + deploymentErrors: [], + compositionWarnings: [], + }; + } - return { - compositionErrors: composition.compositionErrors, - deploymentErrors: composition.deploymentErrors, - compositionWarnings: composition.compositionWarnings, - }; + // Handle Contract Deployment + if (data.federatedGraph.contract) { + const movedContractGraph = await fedGraphRepo.byId(data.federatedGraph.id); + if (!movedContractGraph) { + throw new Error('Could not find contract after moving'); } - const composition = await fedGraphRepo.composeAndDeployGraphs({ - federatedGraphs: [data.federatedGraph], + return await compositionService.composeAndDeployFederatedGraph({ actorId: data.updatedBy, - blobStorage, - admissionConfig: { - cdnBaseUrl: admissionConfig.cdnBaseUrl, - webhookJWTSecret: admissionConfig.jwtSecret, - }, - chClient, - compositionOptions, - webhookProxyUrl, + federatedGraph: movedContractGraph, }); + } - return { - compositionErrors: composition.compositionErrors, - deploymentErrors: composition.deploymentErrors, - compositionWarnings: composition.compositionWarnings, - }; + return await compositionService.composeAndDeployFederatedGraph({ + actorId: data.updatedBy, + federatedGraph: data.federatedGraph, }); } diff --git a/controlplane/src/core/repositories/OrganizationRepository.ts b/controlplane/src/core/repositories/OrganizationRepository.ts index c132f647e7..2ceb5c86cb 100644 --- a/controlplane/src/core/repositories/OrganizationRepository.ts +++ b/controlplane/src/core/repositories/OrganizationRepository.ts @@ -1420,6 +1420,7 @@ export class OrganizationRepository { sso: false, 'subgraph-check-extensions': false, support: false, + 'split-config-loading': false, }; for (const feature of features) { diff --git a/controlplane/src/core/repositories/SubgraphRepository.ts b/controlplane/src/core/repositories/SubgraphRepository.ts index 18c073319c..031a5162da 100644 --- a/controlplane/src/core/repositories/SubgraphRepository.ts +++ b/controlplane/src/core/repositories/SubgraphRepository.ts @@ -33,6 +33,7 @@ import { users, } from '../../db/schema.js'; import { + FeatureFlagDTO, FederatedGraphDTO, GetChecksResponse, Label, @@ -47,6 +48,7 @@ import { SubgraphDTO, SubgraphListFilterOptions, SubgraphMemberDTO, + ComposeAndDeployResult, } from '../../types/index.js'; import { BlobStorage } from '../blobstorage/index.js'; import { ClickHouseClient } from '../clickhouse/index.js'; @@ -67,6 +69,7 @@ import { } from '../util.js'; import { OrganizationWebhookService } from '../webhooks/OrganizationWebhookService.js'; import { traced } from '../tracing.js'; +import type { CompositionService } from '../services/CompositionService.js'; import { ContractRepository } from './ContractRepository.js'; import { FeatureFlagRepository } from './FeatureFlagRepository.js'; import { FederatedGraphRepository } from './FederatedGraphRepository.js'; @@ -243,26 +246,20 @@ export class SubgraphRepository { readme?: string; proto?: ProtoSubgraph; }, - blobStorage: BlobStorage, - admissionConfig: { - webhookJWTSecret: string; - cdnBaseUrl: string; - }, - chClient: ClickHouseClient, - compositionOptions?: CompositionOptions, - webhookProxyUrl?: string, - ): Promise<{ - compositionErrors: PlainMessage[]; - compositionWarnings: PlainMessage[]; - deploymentErrors: PlainMessage[]; - updatedFederatedGraphs: FederatedGraphDTO[]; - subgraphChanged: boolean; - }> { + compositionService: CompositionService, + ): Promise< + ComposeAndDeployResult & { + updatedFederatedGraphs: FederatedGraphDTO[]; + subgraphChanged: boolean; + } + > { const deploymentErrors: PlainMessage[] = []; const compositionErrors: PlainMessage[] = []; const compositionWarnings: PlainMessage[] = []; + // The collection of federated graphs that will be potentially re-composed const updatedFederatedGraphs: FederatedGraphDTO[] = []; + const updatedFeatureFlagIds = new Set(); let subgraphChanged = false; let labelChanged = false; @@ -274,7 +271,13 @@ export class SubgraphRepository { const subgraph = await subgraphRepo.byTargetId(data.targetId); if (!subgraph) { - return { compositionErrors, updatedFederatedGraphs, compositionWarnings }; + return { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + updatedFederatedGraphs, + subgraphChanged: false, + }; } // TODO: avoid downloading the schema use hash instead @@ -286,6 +289,7 @@ export class SubgraphRepository { isV2Graph: data.isV2Graph, proto: data.proto, }); + if (!updatedSubgraph) { throw new Error(`The subgraph "${subgraph.name}" was not found.`); } @@ -294,13 +298,7 @@ export class SubgraphRepository { if (data.routingUrl !== undefined && data.routingUrl !== subgraph.routingUrl) { subgraphChanged = true; const url = normalizeURL(data.routingUrl); - await tx - .update(subgraphs) - .set({ - routingUrl: url, - }) - .where(eq(subgraphs.id, subgraph.id)) - .execute(); + await tx.update(subgraphs).set({ routingUrl: url }).where(eq(subgraphs.id, subgraph.id)).execute(); } if (data.subscriptionUrl !== undefined && data.subscriptionUrl !== subgraph.subscriptionUrl) { @@ -308,9 +306,7 @@ export class SubgraphRepository { const url = normalizeURL(data.subscriptionUrl); await tx .update(subgraphs) - .set({ - subscriptionUrl: url || null, - }) + .set({ subscriptionUrl: url || null }) .where(eq(subgraphs.id, subgraph.id)) .execute(); } @@ -363,8 +359,7 @@ export class SubgraphRepository { // add them to the updatedFederatedGraphs array without duplicates for (const federatedGraph of newFederatedGraphs) { - const exists = updatedFederatedGraphs.find((g) => g.name === federatedGraph.name); - if (!exists) { + if (!updatedFederatedGraphs.some((g) => g.id === federatedGraph.id)) { updatedFederatedGraphs.push(federatedGraph); } } @@ -419,12 +414,14 @@ export class SubgraphRepository { labels: baseSubgraph[0].labels?.map?.((l) => splitLabel(l)) ?? [], namespaceId: data.namespaceId, }); + for (const federatedGraphDTO of federatedGraphDTOs) { // Retrieve all the subgraphs that compose the federated graph to retrieve the feature flags const subgraphs = await subgraphRepo.listByFederatedGraph({ federatedGraphTargetId: federatedGraphDTO.targetId, published: true, }); + const enabledFeatureFlags = await featureFlagRepo.getFeatureFlagsByBaseSubgraphIdAndLabelMatchers({ baseSubgraphId: baseSubgraph[0].id, namespaceId: data.namespaceId, @@ -432,27 +429,30 @@ export class SubgraphRepository { baseSubgraphNames: subgraphs.map((subgraph) => subgraph.name), excludeDisabled: true, }); + // If an enabled feature flag includes the feature graph that has just been published, push it to the array if (enabledFeatureFlags.length > 0) { - const exists = updatedFederatedGraphs.find((g) => g.name === federatedGraphDTO.name); - if (!exists) { + if (!updatedFederatedGraphs.some((g) => g.id === federatedGraphDTO.id)) { updatedFederatedGraphs.push(federatedGraphDTO); } + + for (const featureFlag of enabledFeatureFlags) { + updatedFeatureFlagIds.add(featureFlag.id); + } } } } // Generate a new router config for non-feature graphs upon routing/subscription urls and labels changes } else if (subgraphChanged || labelChanged) { // find all federated graphs that use this subgraph (with old labels). We need evaluate them again. - // When labels change, graphs which matched with old labels may no longer match with new ones + // When labels change, graphs which matched with old labels may no longer match with new ones const affectedGraphs = await fedGraphRepo.bySubgraphLabels({ labels: subgraph.labels, namespaceId: data.namespaceId, }); for (const graph of affectedGraphs) { - const exists = updatedFederatedGraphs.find((g) => g.name === graph.name); - if (!exists) { + if (!updatedFederatedGraphs.some((g) => g.id === graph.id)) { updatedFederatedGraphs.push(graph); } } @@ -463,27 +463,37 @@ export class SubgraphRepository { await targetRepo.updateReadmeOfTarget({ id: data.targetId, readme: data.readme }); } - if (updatedFederatedGraphs.length === 0) { + if (updatedFederatedGraphs.length === 0 && updatedFeatureFlagIds.size === 0) { return; } - const { - compositionErrors: cErrors, - deploymentErrors: dErrors, - compositionWarnings: cWarnings, - } = await fedGraphRepo.composeAndDeployGraphs({ - blobStorage, - admissionConfig, + const updatedFeatureFlags: FeatureFlagDTO[] = []; + if (updatedFeatureFlagIds.size > 0) { + const featureFlagRepo = new FeatureFlagRepository(this.logger, tx, this.organizationId); + for (const featureFlagId of updatedFeatureFlagIds) { + const featureFlag = await featureFlagRepo.getFeatureFlagById({ + namespaceId: data.namespaceId, + featureFlagId, + }); + + if (!featureFlag) { + throw new Error(`Feature flag with ID ${featureFlagId} not found in namespace ${data.namespaceId}`); + } + + updatedFeatureFlags.push(featureFlag); + } + } + + const result = await compositionService.recomposeAndDeployAffected({ actorId: data.updatedBy, - chClient, - compositionOptions, - federatedGraphs: updatedFederatedGraphs.filter((g) => !g.contract), - webhookProxyUrl, + affectedFederatedGraphs: updatedFederatedGraphs.filter((graph) => !graph.contract), + affectedFeatureFlags: updatedFeatureFlags, + isFeatureSubgraph: subgraph.isFeatureSubgraph, }); - compositionErrors.push(...cErrors); - deploymentErrors.push(...dErrors); - compositionWarnings.push(...cWarnings); + deploymentErrors.push(...result.deploymentErrors); + compositionErrors.push(...result.compositionErrors); + compositionWarnings.push(...result.compositionWarnings); // Re-fetch the federated graphs to get the updated composedSchemaVersionId const refreshedGraphs = await Promise.all(updatedFederatedGraphs.map((g) => fedGraphRepo.byId(g.id))); @@ -504,7 +514,7 @@ export class SubgraphRepository { }; } - public move( + public async move( data: { targetId: string; subgraphId: string; @@ -513,80 +523,61 @@ export class SubgraphRepository { currentNamespaceId: string; newNamespaceId: string; }, - blobStorage: BlobStorage, - admissionConfig: { - jwtSecret: string; - cdnBaseUrl: string; - }, - chClient: ClickHouseClient, - compositionOptions?: CompositionOptions, - webhookProxyUrl?: string, - ): Promise<{ - compositionErrors: PlainMessage[]; - updatedFederatedGraphs: FederatedGraphDTO[]; - deploymentErrors: PlainMessage[]; - compositionWarnings: PlainMessage[]; - }> { - return this.db.transaction(async (tx) => { - const updatedFederatedGraphs: FederatedGraphDTO[] = []; - - const fedGraphRepo = new FederatedGraphRepository(this.logger, tx, this.organizationId); + compositionService: CompositionService, + ): Promise { + const updatedFederatedGraphs: FederatedGraphDTO[] = []; - updatedFederatedGraphs.push( - ...(await fedGraphRepo.bySubgraphLabels({ labels: data.subgraphLabels, namespaceId: data.currentNamespaceId })), - ); + const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); + updatedFederatedGraphs.push( + ...(await fedGraphRepo.bySubgraphLabels({ labels: data.subgraphLabels, namespaceId: data.currentNamespaceId })), + ); - await tx.update(targets).set({ namespaceId: data.newNamespaceId }).where(eq(targets.id, data.targetId)); + await this.db.update(targets).set({ namespaceId: data.newNamespaceId }).where(eq(targets.id, data.targetId)); - // Delete all mappings with this subgraph. We will create new mappings with federated graphs in new namespace - await tx - .delete(schema.subgraphsToFederatedGraph) - .where(eq(schema.subgraphsToFederatedGraph.subgraphId, data.subgraphId)); + // Delete all mappings with this subgraph. We will create new mappings with federated graphs in new namespace + await this.db + .delete(schema.subgraphsToFederatedGraph) + .where(eq(schema.subgraphsToFederatedGraph.subgraphId, data.subgraphId)); - const newFederatedGraphs = await fedGraphRepo.bySubgraphLabels({ - labels: data.subgraphLabels, - namespaceId: data.newNamespaceId, - }); - updatedFederatedGraphs.push(...newFederatedGraphs); + const newFederatedGraphs = await fedGraphRepo.bySubgraphLabels({ + labels: data.subgraphLabels, + namespaceId: data.newNamespaceId, + }); - // insert new mappings - if (newFederatedGraphs.length > 0) { - await tx - .insert(schema.subgraphsToFederatedGraph) - .values( - newFederatedGraphs.map((fg) => ({ - federatedGraphId: fg.id, - subgraphId: data.subgraphId, - })), - ) - .onConflictDoNothing() - .execute(); - } + updatedFederatedGraphs.push(...newFederatedGraphs); + + // Insert new mappings + if (newFederatedGraphs.length > 0) { + await this.db + .insert(schema.subgraphsToFederatedGraph) + .values( + newFederatedGraphs.map((fg) => ({ + federatedGraphId: fg.id, + subgraphId: data.subgraphId, + })), + ) + .onConflictDoNothing() + .execute(); + } - const { compositionErrors, deploymentErrors, compositionWarnings } = await fedGraphRepo.composeAndDeployGraphs({ - federatedGraphs: updatedFederatedGraphs.filter((g) => !g.contract), - blobStorage, - admissionConfig: { - webhookJWTSecret: admissionConfig.jwtSecret, - cdnBaseUrl: admissionConfig.cdnBaseUrl, - }, + const { deploymentErrors, compositionErrors, compositionWarnings } = + await compositionService.recomposeAndDeployAffected({ actorId: data.updatedBy, - chClient, - compositionOptions, - webhookProxyUrl, + affectedFederatedGraphs: updatedFederatedGraphs, + affectedFeatureFlags: [], // Feature subgraphs cannot be moved + isFeatureSubgraph: false, }); - // Re-fetch the federated graphs to get the updated composedSchemaVersionId - const refreshedGraphs = await Promise.all(updatedFederatedGraphs.map((g) => fedGraphRepo.byId(g.id))); - for (let i = 0; i < updatedFederatedGraphs.length; i++) { - const refreshedGraph = refreshedGraphs[i]; - if (refreshedGraph) { - updatedFederatedGraphs[i] = refreshedGraph; - } + // Re-fetch the federated graphs to get the updated composedSchemaVersionId + const refreshedGraphs = await Promise.all(updatedFederatedGraphs.map((g) => fedGraphRepo.byId(g.id))); + for (let i = 0; i < updatedFederatedGraphs.length; i++) { + const refreshedGraph = refreshedGraphs[i]; + if (refreshedGraph) { + updatedFederatedGraphs[i] = refreshedGraph; } + } - return { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings }; - }); + return { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings }; } public addSchemaVersion(data: { diff --git a/controlplane/src/core/services/CompositionService.ts b/controlplane/src/core/services/CompositionService.ts new file mode 100644 index 0000000000..6e533c7dd8 --- /dev/null +++ b/controlplane/src/core/services/CompositionService.ts @@ -0,0 +1,1127 @@ +/* eslint-disable no-labels */ +import { createHash, randomUUID } from 'node:crypto'; +import { JsonObject, PlainMessage } from '@bufbuild/protobuf'; +import { FeatureFlagRouterExecutionConfig, RouterConfig } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb'; +import { DeploymentError } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; +import { and, eq, inArray } from 'drizzle-orm'; +import { PostgresJsDatabase } from 'drizzle-orm/postgres-js'; +import { FastifyBaseLogger } from 'fastify'; +import { parse } from 'graphql'; +import { + CompositionOptions, + ROUTER_COMPATIBILITY_VERSION_ONE, + ROUTER_COMPATIBILITY_VERSIONS, + SupportedRouterCompatibilityVersion, +} from '@wundergraph/composition'; +import * as schema from '../../db/schema.js'; +import { + ComposeAndDeployResult, + COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, + FeatureFlagDTO, + FederatedGraphAndCompositionResults, + FederatedGraphDTO, + OrganizationFeatures, + SPLIT_CONFIG_LOADING_FEATURE_ID, +} from '../../types/index.js'; +import { BlobStorage } from '../blobstorage/index.js'; +import { + BaseCompositionData, + Composer, + ContractBaseCompositionData, + routerConfigToFeatureFlagExecutionConfig, + RouterConfigUploadError, +} from '../composition/composer.js'; +import { + composeGraphsInWorker, + deserializeComposedGraphArtifact, + DeserializedComposedGraph, + deserializeRouterExecutionConfig, +} from '../composition/composeGraphs.pool.js'; +import { unsuccessfulBaseCompositionError } from '../errors/errors.js'; +import { ClickHouseClient } from '../clickhouse/index.js'; +import { traced } from '../tracing.js'; +import { FederatedGraphRepository } from '../repositories/FederatedGraphRepository.js'; +import { OrganizationRepository } from '../repositories/OrganizationRepository.js'; +import { ComposeGraphsTaskResultItem } from '../composition/composeGraphs.types.js'; +import { AdmissionError } from './AdmissionWebhookController.js'; +import { ContractRepository } from './../repositories/ContractRepository.js'; +import { FeatureFlagRepository, SubgraphsToCompose } from './../repositories/FeatureFlagRepository.js'; +import { GraphCompositionRepository } from './../repositories/GraphCompositionRepository.js'; +import { SubgraphRepository } from './../repositories/SubgraphRepository.js'; + +@traced +export class CompositionService { + constructor( + private db: PostgresJsDatabase, + private organizationId: string, + private logger: FastifyBaseLogger, + private admissionConfig: { + webhookJWTSecret: string; + cdnBaseUrl: string; + }, + private blobStorage: BlobStorage, + private chClient: ClickHouseClient | undefined, + private webhookProxyUrl: string | undefined, + private disableResolvabilityValidation: boolean | undefined, + ) {} + + public async composeAndDeployFederatedGraph({ + actorId, + federatedGraph, + }: { + actorId: string; + federatedGraph: FederatedGraphDTO; + }): Promise { + const orgFeatures = await this.#getOrganizationFeatures(); + const compositionOptions: CompositionOptions = { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }; + + if (!orgFeatures.splitConfigLoading) { + return this.#legacyComposeAndDeploy({ + actorId, + federatedGraphs: [federatedGraph], + compositionOptions, + }); + } + + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); + const contractRepo = new ContractRepository(this.logger, this.db, this.organizationId); + + const result: ComposeAndDeployResult = { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + + // Get published subgraphs for recomposition of the federated graph + const subgraphs = await subgraphRepo.listByFederatedGraph({ + federatedGraphTargetId: federatedGraph.targetId, + published: true, + }); + + const contracts = await contractRepo.bySourceFederatedGraphId(federatedGraph.id); + const tagOptionsByContractName = contracts.map((contract) => ({ + contractName: contract.downstreamFederatedGraph.target.name, + excludeTags: contract.excludeTags, + includeTags: contract.includeTags, + })); + + const { results } = await composeGraphsInWorker({ + federatedGraph, + subgraphsToCompose: [ + { + subgraphs, + isFeatureFlagComposition: false, + featureFlagName: '', + featureFlagId: '', + }, + ], + tagOptionsByContractName, + compositionOptions, + }); + + await this.#handleCompositionResultsAndDeploy({ + actorId, + graphAndCompositionResults: [{ federatedGraph, results }], + result, + splitConfig: true, + }); + + return result; + } + + public async composeAndDeployFeatureFlag({ + actorId, + featureFlag, + isEnabled, + prevFederatedGraphs, + }: { + actorId: string; + featureFlag: FeatureFlagDTO; + isEnabled?: boolean; + prevFederatedGraphs?: FederatedGraphDTO[]; + }): Promise { + const orgFeatures = await this.#getOrganizationFeatures(); + const enabled = isEnabled ?? featureFlag.isEnabled; + if (!orgFeatures.splitConfigLoading) { + return await this.#legacyComposeAndDeployFeatureFlag({ + actorId, + featureFlag, + enabled, + orgFeatures, + prevFederatedGraphs, + }); + } + + const result: ComposeAndDeployResult = { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + + const featureFlagRepo = new FeatureFlagRepository(this.logger, this.db, this.organizationId); + const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ + featureFlagId: featureFlag.id, + namespaceId: featureFlag.namespaceId, + excludeDisabled: enabled, + includeContracts: true, + }); + + // If the feature flag belonged to one or more federated graphs, we need to delete the router config for the + // graphs that are no longer associated with the feature flag + if (prevFederatedGraphs && prevFederatedGraphs.length > 0) { + const federatedGraphsToDeleteFrom: FederatedGraphDTO[] = []; + for (const graph of prevFederatedGraphs) { + if (!federatedGraphs.some((g) => g.id === graph.id)) { + federatedGraphsToDeleteFrom.push(graph); + } + } + + const deleteErrors = await this.#deleteFeatureFlagConfigs(featureFlag, federatedGraphsToDeleteFrom); + if (deleteErrors.length > 0) { + result.deploymentErrors.push(...deleteErrors); + return result; + } + } + + if (federatedGraphs.length === 0) { + // The feature flag is not associated with any federated graphs + return result; + } + + if (!enabled) { + // The feature flag is disabled; instead of recomposing, we are just going to delete the router configuration + // from the federated graphs the feature flag is associated with + const deleteError = await this.#deleteFeatureFlagConfigs(featureFlag, federatedGraphs); + result.deploymentErrors.push(...deleteError); + return result; + } + + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); + const compositionOptions: CompositionOptions = { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }; + + const graphAndCompositionResults: FederatedGraphAndCompositionResults[] = []; + for (const graph of federatedGraphs) { + // Get published subgraphs for recomposition of the federated graph + const subgraphs = await subgraphRepo.listByFederatedGraph({ + federatedGraphTargetId: graph.targetId, + published: true, + }); + + const baseCompositionSubgraphs = subgraphs.map((s) => ({ + name: s.name, + url: s.routingUrl, + definitions: parse(s.schemaSDL), + })); + + const subgraphsToCompose = featureFlagRepo.getFeatureFlagRelatedSubgraphsToCompose( + new Map([[featureFlag.id, featureFlag]]), + baseCompositionSubgraphs, + subgraphs, + [], + ); + + const { results } = await composeGraphsInWorker({ + federatedGraph: graph, + subgraphsToCompose: subgraphsToCompose.map((s) => ({ + subgraphs: s.subgraphs, + isFeatureFlagComposition: s.isFeatureFlagComposition, + featureFlagName: s.featureFlagName, + featureFlagId: s.featureFlagId, + })), + /** + * Do not recompose contracts of a base graph; if the feature flag also belongs to a contract, the + * contract will be itself added to the `federatedGraphs` array. + * + * Consequently, if `graph` is a contract, pass the tag data through to the feature flag composition. + */ + tagOptionsByContractName: graph.contract + ? [ + { + contractName: graph.name, + excludeTags: graph.contract.excludeTags, + includeTags: graph.contract.includeTags, + }, + ] + : [], + compositionOptions, + }); + + graphAndCompositionResults.push({ federatedGraph: graph, results }); + } + + await this.#handleCompositionResultsAndDeploy({ + actorId, + graphAndCompositionResults, + result, + isFeatureFlagComposition: true, + splitConfig: true, + }); + + return result; + } + + public async deleteFeatureFlag({ + actorId, + featureFlag, + authorize, + }: { + actorId: string; + featureFlag: FeatureFlagDTO; + authorize: (graph: FederatedGraphDTO) => Promise; + }): Promise { + const orgFeatures = await this.#getOrganizationFeatures(); + const featureFlagRepo = new FeatureFlagRepository(this.logger, this.db, this.organizationId); + + // Collect the federated graph DTOs that have the feature flag enabled because they will be re-composed + const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ + featureFlagId: featureFlag.id, + namespaceId: featureFlag.namespaceId, + // if deleting when already disabled, there are no compositions to be done. + excludeDisabled: true, + includeContracts: orgFeatures.splitConfigLoading, + }); + + // Check that the user is authorized to delete the feature flag. + // The user must have authorization for each related federated graph + for (const federatedGraph of federatedGraphs) { + // Check if the user is authorized to perform the action + await authorize(federatedGraph); + } + + /** + * We need to have the actual deletion here because the legacy implementation needs the feature flag to be + * deleted before composition; however, v2 needs it to happen after we know the graphs the feature flag is applied + * to because, instead of recomposing everything, we just remove the feature flag composition. + */ + await featureFlagRepo.delete(featureFlag.id); + + if (!orgFeatures.splitConfigLoading) { + return await this.#legacyComposeAndDeploy({ + actorId, + federatedGraphs, + compositionOptions: { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }, + }); + } + + return { + deploymentErrors: await this.#deleteFeatureFlagConfigs(featureFlag, federatedGraphs), + compositionErrors: [], + compositionWarnings: [], + }; + } + + async recomposeAndDeployAffected({ + actorId, + affectedFederatedGraphs, + affectedFeatureFlags, + isFeatureSubgraph, + }: { + actorId: string; + affectedFederatedGraphs: FederatedGraphDTO[]; + affectedFeatureFlags: FeatureFlagDTO[]; + isFeatureSubgraph: boolean; + }): Promise { + const orgFeatures = await this.#getOrganizationFeatures(); + if (!orgFeatures.splitConfigLoading) { + return await this.#legacyComposeAndDeploy({ + actorId, + federatedGraphs: affectedFederatedGraphs, + compositionOptions: { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }, + }); + } + + const result: ComposeAndDeployResult = { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + + // Compose all affected federated graphs only when the subgraph we are updating is not a feature subgraph + // as these should not affect federated graphs + if (!isFeatureSubgraph) { + for (const federatedGraph of affectedFederatedGraphs) { + const { deploymentErrors, compositionErrors, compositionWarnings } = await this.composeAndDeployFederatedGraph({ + actorId, + federatedGraph, + }); + + result.deploymentErrors.push(...deploymentErrors); + result.compositionErrors.push(...compositionErrors); + result.compositionWarnings.push(...compositionWarnings); + } + } + + // Compose all affected feature flags + for (const featureFlag of affectedFeatureFlags) { + const { deploymentErrors, compositionErrors, compositionWarnings } = await this.composeAndDeployFeatureFlag({ + actorId, + featureFlag, + isEnabled: true, + }); + + result.deploymentErrors.push(...deploymentErrors); + result.compositionErrors.push(...compositionErrors); + result.compositionWarnings.push(...compositionWarnings); + } + + return result; + } + + async #getOrganizationFeatures(): Promise { + const orgRepo = new OrganizationRepository(this.logger, this.db); + const ignoreExternalKeysFeature = await orgRepo.getFeature({ + organizationId: this.organizationId, + featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, + }); + + const splitConfigFeature = await orgRepo.getFeature({ + organizationId: this.organizationId, + featureId: SPLIT_CONFIG_LOADING_FEATURE_ID, + }); + + return { + ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, + splitConfigLoading: splitConfigFeature?.enabled ?? false, + }; + } + + async #legacyComposeAndDeploy({ + actorId, + federatedGraphs, + compositionOptions, + }: { + actorId: string; + federatedGraphs: FederatedGraphDTO[]; + compositionOptions?: CompositionOptions; + }): Promise { + const result: ComposeAndDeployResult = { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + + if (federatedGraphs.length === 0) { + return result; + } + + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); + const contractRepo = new ContractRepository(this.logger, this.db, this.organizationId); + const featureFlagRepo = new FeatureFlagRepository(this.logger, this.db, this.organizationId); + + const graphAndCompositionResults: FederatedGraphAndCompositionResults[] = []; + for (const graph of federatedGraphs) { + // Get published subgraphs for recomposition of the federated graph + const subgraphs = await subgraphRepo.listByFederatedGraph({ + federatedGraphTargetId: graph.targetId, + published: true, + }); + + const contracts = await contractRepo.bySourceFederatedGraphId(graph.id); + const tagOptionsByContractName = contracts.map((contract) => ({ + contractName: contract.downstreamFederatedGraph.target.name, + excludeTags: contract.excludeTags, + includeTags: contract.includeTags, + })); + + const baseCompositionSubgraphs = subgraphs.map((s) => ({ + name: s.name, + url: s.routingUrl, + definitions: parse(s.schemaSDL), + })); + + // Collects the base graph and applicable feature flag-related graphs + const allSubgraphsToCompose: SubgraphsToCompose[] = await featureFlagRepo.getSubgraphsToCompose({ + baseSubgraphs: subgraphs, + baseCompositionSubgraphs, + fedGraphLabelMatchers: graph.labelMatchers, + }); + + const { results } = await composeGraphsInWorker({ + federatedGraph: graph, + subgraphsToCompose: allSubgraphsToCompose.map((g) => ({ + subgraphs: g.subgraphs, + isFeatureFlagComposition: g.isFeatureFlagComposition, + featureFlagName: g.featureFlagName, + featureFlagId: g.featureFlagId, + })), + tagOptionsByContractName, + compositionOptions, + }); + + graphAndCompositionResults.push({ federatedGraph: graph, results }); + } + + await this.#handleCompositionResultsAndDeploy({ actorId, graphAndCompositionResults, result }); + return result; + } + + async #legacyComposeAndDeployFeatureFlag({ + actorId, + featureFlag, + enabled, + orgFeatures, + prevFederatedGraphs, + }: { + actorId: string; + featureFlag: FeatureFlagDTO; + enabled: boolean; + orgFeatures: OrganizationFeatures; + prevFederatedGraphs?: FederatedGraphDTO[]; + }) { + const featureFlagRepo = new FeatureFlagRepository(this.logger, this.db, this.organizationId); + const currentGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ + featureFlagId: featureFlag.id, + namespaceId: featureFlag.namespaceId, + excludeDisabled: enabled, + }); + + const allFederatedGraphIdsToCompose = new Set(); + const allFederatedGraphsToCompose: FederatedGraphDTO[] = []; + for (const graph of [...(prevFederatedGraphs ?? []), ...currentGraphs]) { + if (!allFederatedGraphIdsToCompose.has(graph.id)) { + allFederatedGraphIdsToCompose.add(graph.id); + allFederatedGraphsToCompose.push(graph); + } + } + + return await this.#legacyComposeAndDeploy({ + actorId, + federatedGraphs: allFederatedGraphsToCompose, + compositionOptions: { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }, + }); + } + + #getManifestBasePath(federatedGraphId: string): string { + return `${this.organizationId}/${federatedGraphId}/manifest`; + } + + #getLatestPath(graph: FederatedGraphDTO): string | undefined { + let versionPath = ''; + if (graph.routerCompatibilityVersion !== ROUTER_COMPATIBILITY_VERSION_ONE) { + if (ROUTER_COMPATIBILITY_VERSIONS.has(graph.routerCompatibilityVersion as SupportedRouterCompatibilityVersion)) { + versionPath = `${graph.routerCompatibilityVersion}/`; + } else { + return undefined; + } + } + + return `${versionPath}latest.json`; + } + + async #updateMapperForFederatedGraph(federatedGraphId: string): Promise { + const routerHashesForGraph = await this.db + .select({ + id: schema.routerConfigHash.id, + hash: schema.routerConfigHash.hash, + featureFlagName: schema.featureFlags.name, + }) + .from(schema.routerConfigHash) + .leftJoin(schema.featureFlags, eq(schema.featureFlags.id, schema.routerConfigHash.featureFlagId)) + .where(eq(schema.routerConfigHash.federatedGraphId, federatedGraphId)) + .execute(); + + // Load hashes from database + const mapper = new Map(); + for (const routerHash of routerHashesForGraph) { + mapper.set(routerHash.featureFlagName ?? '', routerHash.hash); + } + + // Serialize the mapper + const serializableMapper: Record = {}; + for (const [key, value] of mapper) { + serializableMapper[key] = value; + } + + // Serialize the mapper content and generate the file signature + const mapperVersion = randomUUID(); + const mapperContent = JSON.stringify(serializableMapper); + const signatureSha256 = createHash('sha256').update(mapperVersion).update(mapperContent).digest('hex'); + + // Upload the mapper file to the CDN + await this.blobStorage.putObject({ + key: `${this.#getManifestBasePath(federatedGraphId)}/mapper.json`, + body: Buffer.from(mapperContent, 'utf8'), + contentType: 'application/json; charset=utf-8', + metadata: { + version: mapperVersion, + 'signature-sha256': signatureSha256, + }, + }); + } + + async #deleteFeatureFlagConfigs( + featureFlag: FeatureFlagDTO, + federatedGraphs: FederatedGraphDTO[], + ): Promise[]> { + if (federatedGraphs.length === 0) { + return []; + } + + // First, we need to delete all the hashes from the database, so we can correctly update the mapper files + await this.db + .delete(schema.routerConfigHash) + .where( + and( + eq(schema.routerConfigHash.featureFlagId, featureFlag.id), + inArray( + schema.routerConfigHash.federatedGraphId, + federatedGraphs.map((graph) => graph.id), + ), + ), + ) + .execute(); + + // Then, we can proceed with deleting the router config for the feature flag and update the mapper files + const deploymentErrors: PlainMessage[] = []; + await Promise.all( + federatedGraphs.map(async (graph) => { + try { + await this.blobStorage.deleteObject({ + key: `${this.#getManifestBasePath(graph.id)}/feature-flags/${featureFlag.name}.json`, + }); + + await this.#updateMapperForFederatedGraph(graph.id); + } catch (err) { + if (err instanceof Error) { + deploymentErrors.push({ + message: err.message, + namespace: graph.namespace, + federatedGraphName: graph.name, + }); + } + } + }), + ); + + return deploymentErrors; + } + + async #handleCompositionResult({ + actorId, + federatedGraph, + compositionResult, + result, + composer, + baseCompositionData, + }: { + actorId: string; + federatedGraph: FederatedGraphDTO; + compositionResult: ComposeGraphsTaskResultItem; + result: ComposeAndDeployResult; + composer: Composer; + baseCompositionData: BaseCompositionData; + }): Promise<{ + baseCompositionFailed: boolean; + federatedSchemaVersionId: string; + baseComposedGraph: DeserializedComposedGraph; + routerExecutionConfig: RouterConfig | undefined; + }> { + if (!compositionResult.base.success) { + // Collect all composition errors + result.compositionErrors.push( + ...compositionResult.base.errors.map((message) => ({ + federatedGraphName: federatedGraph.name, + namespace: federatedGraph.namespace, + message, + featureFlag: compositionResult.featureFlagName || '', + })), + ); + } + + // Collect all composition warnings + result.compositionWarnings.push( + ...compositionResult.base.warnings.map((warning) => ({ + federatedGraphName: federatedGraph.name, + namespace: federatedGraph.namespace, + message: warning.message, + featureFlag: compositionResult.featureFlagName || '', + })), + ); + + if (!compositionResult.isFeatureFlagComposition && !compositionResult.base.success && !federatedGraph.contract) { + result.compositionErrors.push(unsuccessfulBaseCompositionError(federatedGraph.name, federatedGraph.namespace)); + } + + const federatedSchemaVersionId = randomUUID(); + const baseComposedGraph = deserializeComposedGraphArtifact(federatedGraph, compositionResult.base); + let routerExecutionConfig: RouterConfig | undefined; + if (compositionResult.base.success) { + if (!compositionResult.base.routerExecutionConfigJson) { + throw new Error( + `Successful composition for federated graph "${federatedGraph.name}" does not contain a router execution config.`, + ); + } + + routerExecutionConfig = deserializeRouterExecutionConfig(compositionResult.base.routerExecutionConfigJson); + } + + if (routerExecutionConfig) { + routerExecutionConfig.version = federatedSchemaVersionId; + } + + const baseComposition = await composer.saveComposition({ + composedGraph: baseComposedGraph, + composedById: actorId, + isFeatureFlagComposition: compositionResult.isFeatureFlagComposition, + federatedSchemaVersionId, + routerExecutionConfig, + featureFlagId: compositionResult.featureFlagId, + }); + + if (!compositionResult.base.success || !baseComposition.schemaVersionId) { + /* + * If the base composition failed to compose or deploy, return to the parent loop, because + * contracts are not composed if the base composition fails. + */ + if (!compositionResult.isFeatureFlagComposition) { + return { + baseCompositionFailed: true, + federatedSchemaVersionId, + baseComposedGraph, + routerExecutionConfig, + }; + } + + // Record the feature flag composition to upload (if there are no errors) + } else if (compositionResult.isFeatureFlagComposition) { + if (!routerExecutionConfig) { + throw new Error( + `Successful feature flag composition for federated graph "${federatedGraph.name}" does not contain a router execution config.`, + ); + } + + baseCompositionData.featureFlagRouterExecutionConfigByFeatureFlagName.set( + compositionResult.featureFlagName, + routerConfigToFeatureFlagExecutionConfig(routerExecutionConfig), + ); + + // Otherwise, this is the base composition, so store the schema version id + } else { + if (!routerExecutionConfig) { + throw new Error( + `Successful composition for federated graph "${federatedGraph.name}" does not contain a router execution config.`, + ); + } + + baseCompositionData.schemaVersionId = baseComposition.schemaVersionId; + baseCompositionData.routerExecutionConfig = routerExecutionConfig; + } + + return { + baseCompositionFailed: false, + federatedSchemaVersionId, + baseComposedGraph, + routerExecutionConfig, + }; + } + + async #handleCompositionResultsAndDeploy({ + actorId, + graphAndCompositionResults, + result, + isFeatureFlagComposition = false, + splitConfig = false, + }: { + actorId: string; + graphAndCompositionResults: FederatedGraphAndCompositionResults[]; + result: ComposeAndDeployResult; + isFeatureFlagComposition?: boolean; + splitConfig?: boolean; + }): Promise { + const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); + const composer = new Composer( + this.logger, + this.db, + fedGraphRepo, + new SubgraphRepository(this.logger, this.db, this.organizationId), + new ContractRepository(this.logger, this.db, this.organizationId), + new GraphCompositionRepository(this.logger, this.db), + this.chClient, + this.webhookProxyUrl, + ); + + parentLoop: for (const { federatedGraph, results } of graphAndCompositionResults) { + /* + * baseCompositionData contains the router execution config and the schema version ID for the source graph + * base composition (not a contract or feature flag composition) + */ + const baseCompositionData: BaseCompositionData = { + featureFlagRouterExecutionConfigByFeatureFlagName: new Map(), + }; + + /* + * Map of the contract base composition schema version ID, router execution config, + * and any feature flag schema version IDs by contract ID + */ + const contractBaseCompositionDataByContractId = new Map(); + + for (const compositionResult of results) { + const { baseCompositionFailed } = await this.#handleCompositionResult({ + actorId, + federatedGraph, + compositionResult, + result, + composer, + baseCompositionData, + }); + + if (baseCompositionFailed) { + continue parentLoop; + } + + // If there are no contracts, there is nothing further to do + if (compositionResult.contracts.length === 0) { + continue; + } + + for (const { contractName, artifact } of compositionResult.contracts) { + const contractGraph = await fedGraphRepo.byName(contractName, federatedGraph.namespace); + if (!contractGraph) { + throw new Error(`The contract graph "${contractName}" was not found.`); + } + + if (!artifact.success) { + result.compositionErrors.push( + ...artifact.errors.map((message) => ({ + federatedGraphName: contractGraph.name, + namespace: contractGraph.namespace, + message, + featureFlag: compositionResult.featureFlagName, + })), + ); + } + + result.compositionWarnings.push( + ...artifact.warnings.map((warning) => ({ + federatedGraphName: contractGraph.name, + namespace: contractGraph.namespace, + message: warning.message, + featureFlag: compositionResult.featureFlagName, + })), + ); + + const contractSchemaVersionId = randomUUID(); + const contractComposedGraph = deserializeComposedGraphArtifact(contractGraph, artifact); + let contractRouterExecutionConfig; + if (artifact.success) { + if (!artifact.routerExecutionConfigJson) { + throw new Error( + `Successful contract composition for federated graph "${contractGraph.name}" does not contain a router execution config.`, + ); + } + + contractRouterExecutionConfig = deserializeRouterExecutionConfig(artifact.routerExecutionConfigJson); + if (!contractRouterExecutionConfig) { + throw new Error( + `Successful contract composition for federated graph "${contractGraph.name}" did not produce a router execution config.`, + ); + } + + contractRouterExecutionConfig.version = contractSchemaVersionId; + } + + const contractComposition = await composer.saveComposition({ + composedGraph: contractComposedGraph, + composedById: actorId, + isFeatureFlagComposition: compositionResult.isFeatureFlagComposition, + federatedSchemaVersionId: contractSchemaVersionId, + routerExecutionConfig: contractRouterExecutionConfig, + featureFlagId: compositionResult.featureFlagId, + }); + + if (!artifact.success || !contractComposition.schemaVersionId) { + continue; + } + + if (!contractRouterExecutionConfig) { + throw new Error( + `Successful contract composition for federated graph "${contractGraph.name}" did not produce a router execution config.`, + ); + } + + /* + * If the base composition for which this contract has been made is NOT a feature flag composition, + * it must be the contract base composition, which must always be uploaded. + * The base composition is always the first item in the subgraphsToCompose array. + */ + if (!compositionResult.isFeatureFlagComposition) { + contractBaseCompositionDataByContractId.set(contractGraph.id, { + schemaVersionId: contractComposition.schemaVersionId, + routerExecutionConfig: contractRouterExecutionConfig, + featureFlagRouterExecutionConfigByFeatureFlagName: new Map(), + }); + + continue; + } + + /* + * If the contract has a feature flag, get the current array feature flag versions (or set a new one), + * and then push the current schema version to the array + */ + const existingContractBaseCompositionData = contractBaseCompositionDataByContractId.get(contractGraph.id); + + /* + * If the existingContractSchemaVersions is undefined, it means the contract base composition failed. + * In this case, simply continue, because when iterating a feature flag for the source graph composition, + * there may not be any errors for the feature flag. + */ + if (!existingContractBaseCompositionData) { + continue; + } + + existingContractBaseCompositionData.featureFlagRouterExecutionConfigByFeatureFlagName.set( + compositionResult.featureFlagName, + routerConfigToFeatureFlagExecutionConfig(contractRouterExecutionConfig), + ); + } + } + + // Validate composition result + const graph = await fedGraphRepo.byId(federatedGraph.id); + if (!graph) { + throw new Error(`Fatal: The federated graph "${federatedGraph.name}" was not found.`); + } + + if (isFeatureFlagComposition) { + await this.#deployFeatureFlags( + actorId, + graph, + baseCompositionData.featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + ); + } else { + if (!baseCompositionData.routerExecutionConfig) { + throw new Error( + `Fatal: The latest router execution config for federated graph "${federatedGraph.name}" was not generated.`, + ); + } + + if (!baseCompositionData.schemaVersionId) { + throw new Error( + `Fatal: The latest base composition for federated graph "${federatedGraph.name}" was not found.`, + ); + } + + await this.#deployGraph({ + actorId, + routerExecutionConfig: baseCompositionData.routerExecutionConfig, + graph, + schemaVersionId: baseCompositionData.schemaVersionId, + featureFlagRouterExecutionConfigByFeatureFlagName: + baseCompositionData.featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + splitConfig, + }); + } + + if (splitConfig) { + await this.#updateMapperForFederatedGraph(federatedGraph.id); + } + + // Handle contracts + for (const [ + contractId, + { featureFlagRouterExecutionConfigByFeatureFlagName, schemaVersionId, routerExecutionConfig }, + ] of contractBaseCompositionDataByContractId) { + const contractDTO = await fedGraphRepo.byId(contractId); + if (!contractDTO) { + throw new Error(`Unexpected: Contract graph with id "${contractId}" not found after latest composition`); + } + + await this.#deployGraph({ + actorId, + routerExecutionConfig, + graph: contractDTO, + schemaVersionId, + featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + splitConfig, + }); + + if (splitConfig) { + await this.#updateMapperForFederatedGraph(contractDTO.id); + } + } + } + } + + async #deployGraph({ + actorId, + routerExecutionConfig, + graph, + schemaVersionId, + featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + splitConfig, + }: { + actorId: string; + routerExecutionConfig: RouterConfig; + graph: FederatedGraphDTO; + schemaVersionId: string; + featureFlagRouterExecutionConfigByFeatureFlagName: Map; + composer: Composer; + result: ComposeAndDeployResult; + splitConfig: boolean; + }) { + const manifestBasePath = this.#getManifestBasePath(graph.id); + const readyPathOverride = this.#getLatestPath(graph); + if (readyPathOverride) { + const { errors: uploadErrors } = await composer.composeAndUploadRouterConfig({ + admissionConfig: { + cdnBaseUrl: this.admissionConfig.cdnBaseUrl, + jwtSecret: this.admissionConfig.webhookJWTSecret, + }, + baseCompositionRouterExecutionConfig: routerExecutionConfig, + baseCompositionSchemaVersionId: schemaVersionId, + blobStorage: this.blobStorage, + featureFlagRouterExecutionConfigByFeatureFlagName: splitConfig + ? new Map() // Do not populate feature flags when the router config is being split + : featureFlagRouterExecutionConfigByFeatureFlagName, + federatedGraphId: graph.id, + organizationId: this.organizationId, + federatedGraphAdmissionWebhookURL: graph.admissionWebhookURL, + federatedGraphAdmissionWebhookSecret: graph.admissionWebhookSecret, + actorId, + pathOverride: splitConfig + ? { + ready: `${manifestBasePath}/${readyPathOverride}`, + draft: `${manifestBasePath}/draft.json`, + } + : undefined, + }); + + if (splitConfig) { + await this.#saveRouterConfigHash(graph.id, undefined, routerExecutionConfig); + } + + result.deploymentErrors.push( + ...uploadErrors + .filter((e) => e instanceof AdmissionError || e instanceof RouterConfigUploadError) + .map((e) => ({ + federatedGraphName: graph.name, + namespace: graph.namespace, + message: e.message ?? '', + })), + ); + } else { + result.deploymentErrors.push({ + message: `Invalid router compatibility version "${graph.routerCompatibilityVersion}".`, + federatedGraphName: graph.name, + namespace: graph.namespace, + }); + } + + if (splitConfig && featureFlagRouterExecutionConfigByFeatureFlagName.size > 0) { + await this.#deployFeatureFlags( + actorId, + graph, + featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + ); + } + } + + async #deployFeatureFlags( + actorId: string, + graph: FederatedGraphDTO, + featureFlagRouterExecutionConfigByFeatureFlagName: Map, + composer: Composer, + result: ComposeAndDeployResult, + ): Promise { + const baseManifestPath = this.#getManifestBasePath(graph.id); + for (const [ + featureFlagName, + featureFlagRouterExecutionConfig, + ] of featureFlagRouterExecutionConfigByFeatureFlagName.entries()) { + const routerExecutionConfig = RouterConfig.fromJson({ + ...(featureFlagRouterExecutionConfig.toJson() as JsonObject), + compatibilityVersion: graph.routerCompatibilityVersion, + }); + + const { errors: uploadErrors } = await composer.composeAndUploadRouterConfig({ + admissionConfig: { + cdnBaseUrl: this.admissionConfig.cdnBaseUrl, + jwtSecret: this.admissionConfig.webhookJWTSecret, + }, + baseCompositionRouterExecutionConfig: routerExecutionConfig, + baseCompositionSchemaVersionId: '', + blobStorage: this.blobStorage, + featureFlagRouterExecutionConfigByFeatureFlagName: new Map(), + federatedGraphId: graph.id, + organizationId: this.organizationId, + federatedGraphAdmissionWebhookURL: graph.admissionWebhookURL, + federatedGraphAdmissionWebhookSecret: graph.admissionWebhookSecret, + actorId, + pathOverride: { + ready: `${baseManifestPath}/feature-flags/${featureFlagName}.json`, + draft: `${baseManifestPath}/feature-flags/${featureFlagName}.draft.json`, + }, + }); + + await this.#saveRouterConfigHash(graph.id, featureFlagName, routerExecutionConfig); + result.deploymentErrors.push( + ...uploadErrors + .filter((e) => e instanceof AdmissionError || e instanceof RouterConfigUploadError) + .map((e) => ({ + federatedGraphName: graph.name, + namespace: graph.namespace, + message: e.message ?? '', + })), + ); + } + } + + async #saveRouterConfigHash( + federatedGraphId: string, + featureFlagName: string | undefined, + routerConfig: RouterConfig, + ): Promise { + const hash = createHash('sha256').update(routerConfig.toJsonString()).digest('hex'); + + let featureFlag: { id: string } | undefined; + if (featureFlagName) { + const results = await this.db + .select({ id: schema.featureFlags.id }) + .from(schema.featureFlags) + .where( + and( + eq(schema.featureFlags.organizationId, this.organizationId), + eq(schema.featureFlags.name, featureFlagName), + ), + ) + .limit(1) + .execute(); + + featureFlag = results[0]; + } + + await this.db + .insert(schema.routerConfigHash) + .values({ federatedGraphId, featureFlagId: featureFlag?.id ?? null, hash }) + .onConflictDoUpdate({ + target: [schema.routerConfigHash.federatedGraphId, schema.routerConfigHash.featureFlagId], + set: { hash, updatedAt: new Date() }, + }) + .execute(); + } +} diff --git a/controlplane/src/db/models.ts b/controlplane/src/db/models.ts index f887e71400..b04b0066de 100644 --- a/controlplane/src/db/models.ts +++ b/controlplane/src/db/models.ts @@ -128,6 +128,7 @@ export type AuditLogFullAction = | 'feature_flag.deleted' | 'feature_flag.disabled' | 'feature_flag.enabled' + | 'feature_flag.recomposed' | 'feature_subgraph.created' | 'feature_subgraph.deleted' | 'feature_subgraph.published' diff --git a/controlplane/src/db/schema.ts b/controlplane/src/db/schema.ts index 789e824abf..580493d579 100644 --- a/controlplane/src/db/schema.ts +++ b/controlplane/src/db/schema.ts @@ -2639,6 +2639,25 @@ export const namespaceSubgraphCheckExtensionConfig = pgTable( }, ); +export const routerConfigHash = pgTable( + 'router_config_hash', + { + id: uuid('id').primaryKey().defaultRandom(), + federatedGraphId: uuid('federated_graph_id') + .notNull() + .references(() => federatedGraphs.id, { onDelete: 'cascade' }), + featureFlagId: uuid('feature_flag_id').references(() => featureFlags.id, { onDelete: 'cascade' }), + hash: text('hash').notNull(), + createdAt: timestamp('created_at').defaultNow(), + updatedAt: timestamp('updated_at'), + }, + (t) => { + return { + graphFlagIndex: unique('fed_graph_feature_flag_idx').on(t.federatedGraphId, t.featureFlagId).nullsNotDistinct(), + }; + }, +); + export const onboarding = pgTable( 'onboarding', { diff --git a/controlplane/src/types/index.ts b/controlplane/src/types/index.ts index 3cf35cf690..463f73e2b2 100644 --- a/controlplane/src/types/index.ts +++ b/controlplane/src/types/index.ts @@ -1,9 +1,17 @@ -import { LintSeverity } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; +import { + CompositionError, + CompositionWarning, + DeploymentError, + LintSeverity, +} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { JWTPayload } from 'jose'; +import { PlainMessage } from '@bufbuild/protobuf'; import { DBSubgraphType, GraphPruningRuleEnum, OrganizationRole, ProposalMatch, ProposalOrigin } from '../db/models.js'; import { RBACEvaluator } from '../core/services/RBACEvaluator.js'; +import { ComposeGraphsTaskResultItem } from '../core/composition/composeGraphs.types.js'; export const COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID = 'composition-ignore-external-keys'; +export const SPLIT_CONFIG_LOADING_FEATURE_ID = 'split-config-loading'; export type FeatureIds = | 'users' @@ -28,7 +36,8 @@ export type FeatureIds = | 'security' | 'sso' | 'subgraph-check-extensions' - | 'support'; + | 'support' + | 'split-config-loading'; export type Features = { [key in FeatureIds]: Feature; @@ -498,6 +507,7 @@ export type AuthContext = { export interface GraphApiKeyJwtPayload extends JWTPayload { federated_graph_id: string; organization_id: string; + features?: string[]; } export interface PluginAccess { @@ -804,3 +814,19 @@ export interface ProposalSubgraphDTO { isNew: boolean; labels: Label[]; } + +export interface ComposeAndDeployResult { + deploymentErrors: PlainMessage[]; + compositionErrors: PlainMessage[]; + compositionWarnings: PlainMessage[]; +} + +export interface OrganizationFeatures { + ignoreExternalKeys: boolean; + splitConfigLoading: boolean; +} + +export interface FederatedGraphAndCompositionResults { + federatedGraph: FederatedGraphDTO; + results: ComposeGraphsTaskResultItem[]; +} diff --git a/controlplane/test/feature-flag/feature-flag-integration-v2.test.ts b/controlplane/test/feature-flag/feature-flag-integration-v2.test.ts new file mode 100644 index 0000000000..79afe24619 --- /dev/null +++ b/controlplane/test/feature-flag/feature-flag-integration-v2.test.ts @@ -0,0 +1,1466 @@ +import fs from 'node:fs'; +import { join } from 'node:path'; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'; +import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; +import { afterAllSetup, beforeAllSetup, genID } from '../../src/core/test-util.js'; +import { Label } from '../../src/types/index.js'; +import { unsuccessfulBaseCompositionError } from '../../src/core/errors/errors.js'; +import { + assertExecutionConfigSubgraphNames, + assertFeatureFlagExecutionConfig, + assertMapperContentIsCorrect, + assertNumberOfCompositions, + createAndPublishSubgraph, + createFeatureFlag, + createFederatedGraph, + createNamespace, + createThenPublishFeatureSubgraph, + DEFAULT_SUBGRAPH_URL_TWO, + deleteFeatureFlag, + featureFlagIntegrationTestSetUp, + getDebugTestOptions, + GraphNameAndKey, + SetupTest, + toggleFeatureFlag, +} from '../test-util.js'; +import { ClickHouseClient } from '../../src/core/clickhouse/index.js'; + +// Change to true to enable a longer timeout +const isDebugMode = true; +let dbname = ''; + +vi.mock('../src/core/clickhouse/index.js', () => { + const ClickHouseClient = vi.fn(); + ClickHouseClient.prototype.queryPromise = vi.fn(); + + return { ClickHouseClient }; +}); + +describe('Feature flag integration tests v2', () => { + let chClient: ClickHouseClient; + + beforeEach(() => { + chClient = new ClickHouseClient(); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + beforeAll(async () => { + dbname = await beforeAllSetup(); + }); + + afterAll(async () => { + await afterAllSetup(dbname); + }); + + test( + 'that a feature flag that is enabled upon creation can be disabled and re-enabled (default namespace with labels)', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server, blobStorage } = await SetupTest({ + dbname, + chClient, + enabledFeatures: ['split-config-loading'], + }); + testContext.onTestFinished(() => server.close()); + + const labels = [{ key: 'team', value: 'A' }]; + const baseGraphName = genID('baseFederatedGraphName'); + const federatedGraphResponse = await featureFlagIntegrationTestSetUp( + client, + [ + { name: 'users', hasFeatureSubgraph: true }, + { name: 'products', hasFeatureSubgraph: true }, + ], + baseGraphName, + labels, + ); + + expect(blobStorage.keys()).toHaveLength(2); + const key = blobStorage.keys()[0]; + const mapperKey = blobStorage.keys()[1]; + expect(key).toContain(`${federatedGraphResponse.graph!.id}/manifest/latest.json`); + expect(mapperKey).toContain(`${federatedGraphResponse.graph!.id}/manifest/mapper.json`); + + await assertFeatureFlagExecutionConfig(blobStorage, key, false); + + // The base composition + await assertNumberOfCompositions(client, baseGraphName, 1); + + const featureFlagName = genID('flag'); + await createFeatureFlag(client, featureFlagName, labels, ['users-feature', 'products-feature'], 'default', true); + + expect(blobStorage.keys()).toHaveLength(3); + const ffKey = blobStorage.keys().at(-1); + expect(ffKey).toContain(`${federatedGraphResponse.graph!.id}/manifest/feature-flags/${featureFlagName}.json`); + + await assertMapperContentIsCorrect(blobStorage, 1); + + // The base recomposition and the feature flag composition + await assertNumberOfCompositions(client, baseGraphName, 2); + + await assertFeatureFlagExecutionConfig(blobStorage, key, false); + await toggleFeatureFlag(client, featureFlagName, false); + + expect(blobStorage.keys()).toHaveLength(2); + + // Another base recomposition to remove the feature flag + await assertNumberOfCompositions(client, baseGraphName, 2); + await assertFeatureFlagExecutionConfig(blobStorage, key, false); + await toggleFeatureFlag(client, featureFlagName, true); + + // Another base recomposition and the feature flag composition + await assertNumberOfCompositions(client, baseGraphName, 3); + await assertFeatureFlagExecutionConfig(blobStorage, key, false); + + expect(blobStorage.keys()).toHaveLength(3); + }, + ); + + test( + 'that a feature flag that is enabled upon creation can be disabled and re-enabled (namespace without labels)', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server, blobStorage } = await SetupTest({ + dbname, + chClient, + enabledFeatures: ['split-config-loading'], + }); + testContext.onTestFinished(() => server.close()); + + const labels: Array