in controlplane/src/core/bufservices/federated-graph/getFederatedGraphByName.ts [19:174]
export function getFederatedGraphByName(
opts: RouterOptions,
req: GetFederatedGraphByNameRequest,
ctx: HandlerContext,
): Promise<PlainMessage<GetFederatedGraphByNameResponse>> {
let logger = getLogger(ctx, opts.logger);
return handleError<PlainMessage<GetFederatedGraphByNameResponse>>(ctx, logger, async () => {
const authContext = await opts.authenticator.authenticate(ctx.requestHeader);
logger = enrichLogger(ctx, logger, authContext);
const fedRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId);
const subgraphRepo = new SubgraphRepository(logger, opts.db, authContext.organizationId);
const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId);
req.namespace = req.namespace || DefaultNamespace;
const federatedGraph = await fedRepo.byName(req.name, req.namespace);
if (!federatedGraph) {
return {
subgraphs: [],
featureFlags: [],
featureFlagsInLatestValidComposition: [],
featureSubgraphs: [],
graphRequestToken: '',
response: {
code: EnumStatusCode.ERR_NOT_FOUND,
details: `Graph '${req.name}' not found`,
},
};
}
let requestSeries: PlainMessage<RequestSeriesItem>[] = [];
if (req.includeMetrics && opts.chClient) {
const analyticsDashRepo = new AnalyticsDashboardViewRepository(opts.chClient);
requestSeries = await analyticsDashRepo.getWeeklyRequestSeries(federatedGraph.id, authContext.organizationId);
}
const list = await subgraphRepo.listByFederatedGraph({
federatedGraphTargetId: federatedGraph.targetId,
published: false,
});
const featureFlags = await featureFlagRepo.getFeatureFlagsByFederatedGraph({
federatedGraph,
namespaceId: federatedGraph.namespaceId,
});
const featureFlagsInLatestValidComposition: FeatureFlagDTO[] = [];
if (federatedGraph.schemaVersionId) {
const ffsInLatestValidComposition = await featureFlagRepo.getFeatureFlagSchemaVersionsByBaseSchemaVersion({
baseSchemaVersionId: federatedGraph.schemaVersionId,
});
if (ffsInLatestValidComposition) {
for (const ff of ffsInLatestValidComposition) {
const flag = featureFlags.find((f) => f.id === ff.featureFlagId);
if (flag) {
featureFlagsInLatestValidComposition.push(flag);
}
}
}
}
const featureSubgraphs: Subgraph[] = [];
for (const ff of featureFlags) {
for (const fs of ff.featureSubgraphs) {
if (!featureSubgraphs.some((f) => f.id === fs.id)) {
featureSubgraphs.push(
new Subgraph({
id: fs.id,
name: fs.name,
routingURL: fs.routingUrl,
lastUpdatedAt: fs.lastUpdatedAt,
labels: fs.labels,
targetId: fs.targetId,
subscriptionUrl: fs.subscriptionUrl,
namespace: fs.namespace,
subscriptionProtocol: fs.subscriptionProtocol,
isEventDrivenGraph: fs.isEventDrivenGraph,
isV2Graph: fs.isV2Graph,
websocketSubprotocol: fs.websocketSubprotocol || '',
isFeatureSubgraph: fs.isFeatureSubgraph,
baseSubgraphId: fs.baseSubgraphId,
baseSubgraphName: fs.baseSubgraphName,
}),
);
}
}
}
const routerRequestToken = await fedRepo.getGraphSignedToken({
federatedGraphId: federatedGraph.id,
organizationId: authContext.organizationId,
});
if (!routerRequestToken) {
return {
subgraphs: [],
featureFlags: [],
featureFlagsInLatestValidComposition: [],
featureSubgraphs: [],
graphRequestToken: '',
response: {
code: EnumStatusCode.ERR,
details: 'Router Request token not found',
},
};
}
return {
graph: {
id: federatedGraph.id,
targetId: federatedGraph.targetId,
name: federatedGraph.name,
namespace: federatedGraph.namespace,
routingURL: federatedGraph.routingUrl,
labelMatchers: federatedGraph.labelMatchers,
lastUpdatedAt: federatedGraph.lastUpdatedAt,
connectedSubgraphs: federatedGraph.subgraphsCount,
compositionErrors: federatedGraph.compositionErrors ?? '',
compositionId: federatedGraph.compositionId,
isComposable: federatedGraph.isComposable,
requestSeries,
readme: federatedGraph.readme,
supportsFederation: federatedGraph.supportsFederation,
contract: federatedGraph.contract,
admissionWebhookUrl: federatedGraph.admissionWebhookURL,
routerCompatibilityVersion: federatedGraph.routerCompatibilityVersion,
},
subgraphs: list.map((g) => ({
id: g.id,
name: g.name,
routingURL: g.routingUrl,
lastUpdatedAt: g.lastUpdatedAt,
labels: g.labels,
targetId: g.targetId,
subscriptionUrl: g.subscriptionUrl,
namespace: g.namespace,
subscriptionProtocol: g.subscriptionProtocol,
isEventDrivenGraph: g.isEventDrivenGraph,
isV2Graph: g.isV2Graph,
websocketSubprotocol: g.websocketSubprotocol || '',
isFeatureSubgraph: g.isFeatureSubgraph,
})),
featureFlags,
graphRequestToken: routerRequestToken,
featureFlagsInLatestValidComposition,
featureSubgraphs,
response: {
code: EnumStatusCode.OK,
},
};
});
}