Create scaffolding of consumers
This commit is contained in:
@@ -1,12 +1,15 @@
|
||||
import { ConsumerConfig } from "../consumers/types";
|
||||
|
||||
export type Config = {
|
||||
/**
|
||||
* Tauron service configuration
|
||||
*/
|
||||
tauron: TauronConfig;
|
||||
|
||||
consumers: Record<string, unknown>;
|
||||
};
|
||||
|
||||
export type TauronConfig = {
|
||||
export type TauronConfig = ConsumerConfig & {
|
||||
/**
|
||||
* Path to file containing a username of Tauron account
|
||||
*/
|
||||
|
||||
11
src/consumers/index.ts
Normal file
11
src/consumers/index.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { Dayjs } from "dayjs";
|
||||
import { Config } from "../config";
|
||||
import { MQTTConsumer } from "./mqtt";
|
||||
import { Measurement } from "../fetcher/types";
|
||||
|
||||
const consumers = [
|
||||
new MQTTConsumer()
|
||||
];
|
||||
|
||||
export const consume = (config: Config, date: Dayjs, measurement: Measurement) =>
|
||||
consumers.forEach(consumer => consumer.consume(config, date, measurement));
|
||||
33
src/consumers/types.ts
Normal file
33
src/consumers/types.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import { Dayjs } from "dayjs";
|
||||
import { Measurement } from "../fetcher/types";
|
||||
import { Config } from "../config";
|
||||
|
||||
export type ConsumerConfig = {
|
||||
enable?: boolean;
|
||||
}
|
||||
|
||||
export abstract class Consumer<C extends ConsumerConfig> {
|
||||
public abstract readonly name: string;
|
||||
protected abstract requiredFields: readonly (keyof C)[];
|
||||
protected abstract publish(config: C, date: Dayjs, measurement: Measurement): void;
|
||||
|
||||
#validate(config: Partial<C>): C {
|
||||
for (const field of this.requiredFields) {
|
||||
if (config[field] === undefined) {
|
||||
throw new Error(`The '${String(field)}' configuration field of'${this.name}' consumer is required`)
|
||||
}
|
||||
}
|
||||
|
||||
return config as C;
|
||||
}
|
||||
|
||||
consume(config: Config, date: Dayjs, measurement: Measurement): void {
|
||||
const cfg = config.consumers[this.name] as Partial<C>;
|
||||
|
||||
if (cfg.enable !== true) {
|
||||
return
|
||||
}
|
||||
|
||||
this.publish(this.#validate(cfg), date, measurement);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user