Skip to content

Commit

Permalink
refactor(mikro-orm): align with the changes introduced in the mikro-o…
Browse files Browse the repository at this point in the history
  • Loading branch information
derevnjuk committed Jul 10, 2023
1 parent cf3c897 commit 0f0faf9
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 28 deletions.
6 changes: 3 additions & 3 deletions packages/orm/mikro-orm/src/MikroOrmModule.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import {MikroOrmContext} from "./services/MikroOrmContext";
import {MikroOrmRegistry} from "./services/MikroOrmRegistry";
import {Subscriber} from "./decorators/subscriber";

export class Subscriber1 implements EventSubscriber {}
class Subscriber1 implements EventSubscriber {}

@Subscriber()
export class Subscriber2 implements EventSubscriber {}
class Subscriber2 implements EventSubscriber {}

describe("MikroOrmModule", () => {
const config: Options = {
Expand Down Expand Up @@ -57,7 +57,7 @@ describe("MikroOrmModule", () => {
});

describe("$onInit", () => {
it("should register the corresponding instances", async () => {
it("should register the subscribers", async () => {
// act
await mikroOrmModule.$onInit();

Expand Down
51 changes: 40 additions & 11 deletions packages/orm/mikro-orm/src/MikroOrmModule.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
import "./services/MikroOrmFactory";
import {AlterRunInContext, Constant, Inject, Module, OnDestroy, OnInit, registerProvider} from "@tsed/di";
import {
AlterRunInContext,
Constant,
Inject,
InjectorService,
LocalsContainer,
Module,
OnDestroy,
OnInit,
ProviderScope,
registerProvider
} from "@tsed/di";
import {EventSubscriber, Options} from "@mikro-orm/core";
import {MikroOrmRegistry} from "./services/MikroOrmRegistry";
import {RetryStrategy} from "./services/RetryStrategy";
import {OptimisticLockErrorFilter} from "./filters/OptimisticLockErrorFilter";
import {MikroOrmContext} from "./services/MikroOrmContext";
import {classOf, Store} from "@tsed/core";
import {classOf, isFunction, Store} from "@tsed/core";
import {DEFAULT_CONTEXT_NAME, SUBSCRIBER_INJECTION_TYPE} from "./constants";

declare global {
Expand Down Expand Up @@ -34,17 +45,15 @@ export class MikroOrmModule implements OnDestroy, OnInit, AlterRunInContext {
@Inject()
private readonly context!: MikroOrmContext;

@Inject()
private readonly injector!: InjectorService;

constructor(@Inject(SUBSCRIBER_INJECTION_TYPE) private subscribers: EventSubscriber[]) {}

public async $onInit(): Promise<void> {
await Promise.all(
this.settings.map(async (opts) =>
this.registry.register({
...opts,
subscribers: [...(opts.subscribers ?? []), ...this.getSubscribers(opts.contextName)]
})
)
);
const container = new LocalsContainer();

await Promise.all(this.settings.map((opts) => this.registry.register({...opts, subscribers: this.getSubscribers(opts, container)})));
}

public $onDestroy(): Promise<void> {
Expand All @@ -55,7 +64,27 @@ export class MikroOrmModule implements OnDestroy, OnInit, AlterRunInContext {
return () => this.createContext(next);
}

private getSubscribers(contextName: string = DEFAULT_CONTEXT_NAME): EventSubscriber[] {
private getSubscribers(opts: Pick<Options, "subscribers" | "contextName">, container: LocalsContainer) {
return [...this.getUnmanagedSubscribers(opts, container), ...this.getManagedSubscribers(opts.contextName)];
}

private getUnmanagedSubscribers(opts: Pick<Options, "subscribers">, container: LocalsContainer) {
const diOpts = {scope: ProviderScope.INSTANCE};

return (opts.subscribers ?? []).map((subscriber) => {
// Starting from https://github.com/mikro-orm/mikro-orm/issues/4231 mikro-orm
// accept also accepts class reference, not just instances.
if (isFunction(subscriber)) {
return this.injector.invoke(subscriber, container, diOpts);
}

this.injector.bindInjectableProperties(subscriber, container, diOpts);

return subscriber;
});
}

private getManagedSubscribers(contextName: string = DEFAULT_CONTEXT_NAME): EventSubscriber[] {
return this.subscribers.filter((instance) => Store.from(classOf(instance)).get(SUBSCRIBER_INJECTION_TYPE)?.contextName === contextName);
}

Expand Down
2 changes: 1 addition & 1 deletion packages/orm/mikro-orm/test/helpers/Server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import compress from "compression";
import cookieParser from "cookie-parser";
import filedirname from "filedirname";
import methodOverride from "method-override";
import "./services/EventSubscriber1";
import "./services/ManagedEventSubscriber";

// FIXME remove when esm is ready
const [, rootDir] = filedirname();
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import {Logger} from "@tsed/logger";
import {Subscriber} from "../../../src";

@Subscriber()
export class EventSubscriber1 implements EventSubscriber {
export class ManagedEventSubscriber implements EventSubscriber {
constructor(@Inject() private readonly logger: Logger) {}

public async afterFlush(_: TransactionEventArgs): Promise<void> {
public afterFlush(_: TransactionEventArgs): Promise<void> {
this.logger.info("Changes has been flushed.");
return Promise.resolve();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import {EventSubscriber, TransactionEventArgs} from "@mikro-orm/core";
import {$log, Logger} from "@tsed/logger";
import {Inject} from "@tsed/di";

export class UnmanagedEventSubscriber1 implements EventSubscriber {
constructor(@Inject() private readonly logger: Logger) {}

public afterFlush(_: TransactionEventArgs): Promise<void> {
$log.info("Changes has been flushed.");
return Promise.resolve();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {EventSubscriber, TransactionEventArgs} from "@mikro-orm/core";
import {$log, Logger} from "@tsed/logger";
import {Inject} from "@tsed/di";

export class UnmanagedEventSubscriber2 implements EventSubscriber {
@Inject()
private readonly logger: Logger;

public afterFlush(_: TransactionEventArgs): Promise<void> {
$log.info("Changes has been flushed.");
return Promise.resolve();
}
}
7 changes: 4 additions & 3 deletions packages/orm/mikro-orm/test/integration.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import {Server} from "./helpers/Server";
import {UserService} from "./helpers/services/UserService";
import {MikroORM} from "@mikro-orm/core";
import {anything, spy, verify} from "ts-mockito";
import {EventSubscriber2} from "./helpers/services/EventSubscriber2";
import {UnmanagedEventSubscriber1} from "./helpers/services/UnmanagedEventSubscriber1";
import {UnmanagedEventSubscriber2} from "./helpers/services/UnmanagedEventSubscriber2";
import {MikroOrmModule, TransactionalInterceptor} from "../src";

describe("MikroOrm integration", () => {
Expand All @@ -21,7 +22,7 @@ describe("MikroOrm integration", () => {
clientUrl,
type: "mongo",
entities: [User],
subscribers: [new EventSubscriber2()]
subscribers: [UnmanagedEventSubscriber1, new UnmanagedEventSubscriber2()]
},
{
clientUrl,
Expand Down Expand Up @@ -78,6 +79,6 @@ describe("MikroOrm integration", () => {

await service.create({email: "test@example.com"});

verify(spiedLogger.info("Changes has been flushed.")).twice();
verify(spiedLogger.info("Changes has been flushed.")).thrice();
});
});

0 comments on commit 0f0faf9

Please sign in to comment.