Ensure DocsSynchronizer has access to cache client.

Signed-off-by: Eric Peterson <ericpeterson@spotify.com>
This commit is contained in:
Eric Peterson
2021-07-24 23:07:33 +02:00
committed by Eric Peterson
parent 74ccd66e26
commit d011fd61ea
4 changed files with 26 additions and 7 deletions
@@ -222,6 +222,9 @@ export class DocsBuilder {
// Invalidate the cache for any published objects.
if (this.cache && published && published?.objects?.length) {
this.logger.debug(
`Invalidating ${published.objects.length} cache objects`,
);
await this.cache.invalidateMultiple(published.objects);
}
@@ -25,6 +25,7 @@ import {
PreparerBuilder,
PublisherBase,
} from '@backstage/techdocs-common';
import { TechDocsCache } from '../cache';
import { DocsBuilder, shouldCheckForUpdate } from '../DocsBuilder';
import { DocsSynchronizer, DocsSynchronizerSyncOpts } from './DocsSynchronizer';
@@ -52,6 +53,12 @@ describe('DocsSynchronizer', () => {
getBaseUrl: jest.fn(),
getExternalBaseUrl: jest.fn(),
};
const cache: jest.Mocked<TechDocsCache> = ({
get: jest.fn(),
set: jest.fn(),
invalidate: jest.fn(),
invalidateMultiple: jest.fn(),
} as unknown) as jest.Mocked<TechDocsCache>;
let docsSynchronizer: DocsSynchronizer;
const mockResponseHandler: jest.Mocked<DocsSynchronizerSyncOpts> = {
@@ -71,6 +78,7 @@ describe('DocsSynchronizer', () => {
config: new ConfigReader({}),
logger: getVoidLogger(),
scmIntegrations: ScmIntegrations.fromConfig(new ConfigReader({})),
cache,
});
});
@@ -25,6 +25,7 @@ import {
} from '@backstage/techdocs-common';
import { PassThrough } from 'stream';
import * as winston from 'winston';
import { TechDocsCache } from '../cache';
import { DocsBuilder, shouldCheckForUpdate } from '../DocsBuilder';
export type DocsSynchronizerSyncOpts = {
@@ -38,22 +39,26 @@ export class DocsSynchronizer {
private readonly logger: winston.Logger;
private readonly config: Config;
private readonly scmIntegrations: ScmIntegrationRegistry;
private readonly cache: TechDocsCache | undefined;
constructor({
publisher,
logger,
config,
scmIntegrations,
cache,
}: {
publisher: PublisherBase;
logger: winston.Logger;
config: Config;
scmIntegrations: ScmIntegrationRegistry;
cache: TechDocsCache | undefined;
}) {
this.config = config;
this.logger = logger;
this.publisher = publisher;
this.scmIntegrations = scmIntegrations;
this.cache = cache;
}
async doSync({
@@ -104,6 +109,7 @@ export class DocsSynchronizer {
config: this.config,
scmIntegrations: this.scmIntegrations,
logStream,
cache: this.cache,
});
const updated = await docsBuilder.build();
@@ -85,13 +85,6 @@ export async function createRouter(
const router = Router();
const { publisher, config, logger, discovery } = options;
const catalogClient = new CatalogClient({ discoveryApi: discovery });
const scmIntegrations = ScmIntegrations.fromConfig(config);
const docsSynchronizer = new DocsSynchronizer({
publisher,
logger,
config,
scmIntegrations,
});
// Set up a cache client if configured.
let cache: TechDocsCache | undefined;
@@ -101,6 +94,15 @@ export async function createRouter(
cache = new TechDocsCache({ cache: cacheClient, logger });
}
const scmIntegrations = ScmIntegrations.fromConfig(config);
const docsSynchronizer = new DocsSynchronizer({
publisher,
logger,
config,
scmIntegrations,
cache,
});
router.get('/metadata/techdocs/:namespace/:kind/:name', async (req, res) => {
const { kind, namespace, name } = req.params;
const entityName = { kind, namespace, name };