diff --git a/src/subscriber/provider.ts b/src/subscriber/provider.ts new file mode 100644 index 0000000..0e76492 --- /dev/null +++ b/src/subscriber/provider.ts @@ -0,0 +1,28 @@ +import type { SubscribedEvent } from "./event.js"; +import type { SubscriberRegistryInterface } from "./registry.js"; +import type { SubscriberInterface } from "./subscriber.js"; + +export interface SubscriberProviderInterface { + /** + * Gets all subscribers which are subscribed to the received event. + * + * @param event Event received. + */ + getSubscribersForEvent(event: T): SubscriberInterface[]; +} + +export class SubscriberProvider implements SubscriberProviderInterface { + private subscribers: SubscriberInterface[]; + + constructor(registry: SubscriberRegistryInterface) { + this.subscribers = registry.all(); + } + + getSubscribersForEvent(event: T): SubscriberInterface[] { + const subscribers = this.subscribers.filter((subscriber): boolean => + subscriber.getSubscribedEvents().includes(event), + ) as SubscriberInterface[]; + + return subscribers; + } +} diff --git a/tests/fixtures/push-subscriber.ts b/tests/fixtures/push-subscriber.ts new file mode 100644 index 0000000..ef591f2 --- /dev/null +++ b/tests/fixtures/push-subscriber.ts @@ -0,0 +1,17 @@ +import { ConfigObject } from "../../src/configuration"; +import { ContextDecorator } from "../../src/context"; +import { Subscriber } from "../../src/subscriber/subscriber"; + +export class PushSubscriber extends Subscriber<"push"> { + constructor(config: ConfigObject) { + super(config); + } + + async process(context: ContextDecorator<"push">): Promise { + await Promise.resolve(); + } + + getSubscribedEvents(): ["push"] { + return ["push"]; + } +} diff --git a/tests/subscriber/provider.test.ts b/tests/subscriber/provider.test.ts new file mode 100644 index 0000000..de63f99 --- /dev/null +++ b/tests/subscriber/provider.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, test } from "vitest"; +import { ConfigObject } from "../../src/configuration"; +import { map } from "../../src/subscriber/map"; +import { SubscriberProvider } from "../../src/subscriber/provider"; +import { SubscriberRegistry } from "../../src/subscriber/registry"; +import { GenericSubscriber } from "../fixtures/generic-subscriber"; +import { PushSubscriber } from "../fixtures/push-subscriber"; + +describe("subscriber provider", () => { + const config = { + version: 1, + settings: { + active_subscribers: ["generic", "push"], + }, + } as ConfigObject; + + map.set("generic", new GenericSubscriber(config)); + map.set("push", new PushSubscriber(config)); + + const registry = new SubscriberRegistry(config.settings.active_subscribers, map); + + test("Provider can get subscribers for event", () => { + const provider = new SubscriberProvider(registry); + const subscribers = provider.getSubscribersForEvent("push"); + + expect(subscribers.length).toBe(1); + expect(subscribers[0]).toBeInstanceOf(PushSubscriber); + }); + + test("Provider returns empty array if no subscribers found", () => { + const provider = new SubscriberProvider(registry); + const subscribers = provider.getSubscribersForEvent("pull_request.opened"); + + expect(subscribers.length).toBe(0); + }); +});