backend-common: refactor UrlReaders to only expose static methods

This commit is contained in:
Patrik Oldsberg
2020-10-03 16:52:31 +02:00
parent e6a6f2f264
commit 2527afac9e
5 changed files with 43 additions and 51 deletions
@@ -24,48 +24,34 @@ import { GithubUrlReader } from './GithubUrlReader';
import { GitlabUrlReader } from './GitlabUrlReader';
import { FetchUrlReader } from './FetchUrlReader';
type CreateOptions = {
/** Root config object */
config: Config;
/** Logger used by all the readers */
logger: Logger;
/** A list of factories used to construct individual readers that match on URLs */
factories?: ReaderFactory[];
/** Fallback reader to use if none of the readers created by the factories match */
fallback?: UrlReader;
};
/**
* UrlReaders provide various utilities related to the UrlReader interface.
*/
export class UrlReaders {
/**
* Creates a new UrlReaders instance without any known types.
* Creates a UrlReader without any known types.
*/
static empty({ logger }: { logger: Logger }) {
return new UrlReaders([], logger);
}
static create({
logger,
config,
factories,
fallback,
}: CreateOptions): UrlReader {
const mux = new UrlReaderPredicateMux({ fallback: fallback });
/**
* Creates a new UrlReaders instance that includes all the default factories from this package
*/
static default({ logger }: { logger: Logger }) {
return new UrlReaders(
[
AzureUrlReader.factory,
BitbucketUrlReader.factory,
GithubUrlReader.factory,
GitlabUrlReader.factory,
],
logger,
new FetchUrlReader(),
);
}
private constructor(
private readonly factories: ReaderFactory[],
private readonly logger: Logger,
private fallback?: UrlReader,
) {}
/**
* Constructs a new UrlReader using the provided configuration. Any encountered
* reader type needs to have a registered factory, or an error will be thrown.
*/
createWithConfig(config: Config): UrlReader {
const mux = new UrlReaderPredicateMux({ fallback: this.fallback });
for (const factory of this.factories) {
const tuples = factory({ config, logger: this.logger });
for (const factory of factories ?? []) {
const tuples = factory({ config, logger: logger });
for (const tuple of tuples) {
mux.register(tuple);
@@ -76,13 +62,23 @@ export class UrlReaders {
}
/**
* Register a UrlReader factory
* Creates a UrlReader that includes all the default factories from this package.
*
* Any additional factories passed will be loaded before the default ones.
*
* If no fallback reader is passed, a plain fetch reader will be used.
*/
addFactory(factory: ReaderFactory) {
this.factories.push(factory);
}
setFallback(reader?: UrlReader) {
this.fallback = reader;
static default({ logger, config, factories = [], fallback }: CreateOptions) {
return UrlReaders.create({
logger,
config,
factories: factories.concat([
AzureUrlReader.factory,
BitbucketUrlReader.factory,
GithubUrlReader.factory,
GitlabUrlReader.factory,
]),
fallback: fallback ?? new FetchUrlReader(),
});
}
}
+1 -1
View File
@@ -51,7 +51,7 @@ import { PluginEnvironment } from './types';
function makeCreateEnv(loadedConfigs: AppConfig[]) {
const config = ConfigReader.fromConfigs(loadedConfigs);
const root = getRootLogger();
const reader = UrlReaders.default({ logger: root }).createWithConfig(config);
const reader = UrlReaders.default({ logger: root, config });
const discovery = SingleHostDiscovery.fromConfig(config);
root.info(`Created UrlReader ${reader}`);
@@ -29,7 +29,7 @@ import { PluginEnvironment } from './types';
function makeCreateEnv(loadedConfigs: AppConfig[]) {
const config = ConfigReader.fromConfigs(loadedConfigs);
const root = getRootLogger();
const reader = UrlReaders.default({ logger: root }).createWithConfig(config);
const reader = UrlReaders.default({ logger: root, config });
const discovery = SingleHostDiscovery.fromConfig(config);
root.info(`Created UrlReader ${reader}`);
@@ -35,9 +35,7 @@ describe('UrlReaderProcessor', () => {
it('should load from url', async () => {
const logger = getVoidLogger();
const reader = UrlReaders.default({ logger }).createWithConfig(
new ConfigReader({}),
);
const reader = UrlReaders.default({ logger, config: new ConfigReader({}) });
const processor = new UrlReaderProcessor({ reader, logger });
const spec = {
type: 'url',
@@ -61,9 +59,7 @@ describe('UrlReaderProcessor', () => {
it('should fail load from url with error', async () => {
const logger = getVoidLogger();
const reader = UrlReaders.default({ logger }).createWithConfig(
new ConfigReader({}),
);
const reader = UrlReaders.default({ logger, config: new ConfigReader({}) });
const processor = new UrlReaderProcessor({ reader, logger });
const spec = {
type: 'url',
@@ -40,7 +40,7 @@ export async function startStandaloneServer(
): Promise<Server> {
const logger = options.logger.child({ service: 'catalog-backend' });
const config = ConfigReader.fromConfigs(await loadBackendConfig());
const reader = UrlReaders.default({ logger }).createWithConfig(config);
const reader = UrlReaders.default({ logger, config });
logger.debug('Creating application...');
const db = await DatabaseManager.createInMemoryDatabase({ logger });