Skip to content

Commit c61533d

Browse files
committed
Narrowed down types.
1 parent d9e3d41 commit c61533d

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

packages/outbox-prisma-adapter/lib/outbox-prisma-adapter.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,27 @@ import type { OutboxStorage } from '@message-queue-toolkit/outbox-core/dist/lib/
33
import { type CommonEventDefinition, getMessageType } from '@message-queue-toolkit/schemas'
44
import type { PrismaClient } from '@prisma/client'
55

6-
export class OutboxPrismaAdapter<SupportedEvents extends CommonEventDefinition[]>
7-
implements OutboxStorage<SupportedEvents>
6+
type ModelDelegate = {
7+
create: (args: any) => Promise<any>
8+
findMany: (args: any) => Promise<any>
9+
createMany: (args: any) => Promise<any>
10+
updateMany: (args: any) => Promise<any>
11+
}
12+
13+
export class OutboxPrismaAdapter<
14+
SupportedEvents extends CommonEventDefinition[],
15+
ModelName extends keyof PrismaClient & string,
16+
> implements OutboxStorage<SupportedEvents>
817
{
918
constructor(
1019
private readonly prisma: PrismaClient,
11-
private readonly modelName: string,
20+
private readonly modelName: ModelName,
1221
) {}
1322

1423
createEntry(
1524
outboxEntry: OutboxEntry<SupportedEvents[number]>,
1625
): Promise<OutboxEntry<SupportedEvents[number]>> {
17-
const prismaModel: PrismaClient[typeof this.modelName] = this.prisma[this.modelName]
26+
const prismaModel = this.prisma[this.modelName] as unknown as ModelDelegate
1827

1928
const messageType = getMessageType(outboxEntry.event)
2029
return prismaModel.create({
@@ -33,7 +42,7 @@ export class OutboxPrismaAdapter<SupportedEvents extends CommonEventDefinition[]
3342
async flush(outboxAccumulator: OutboxAccumulator<SupportedEvents>): Promise<void> {
3443
const entries = await outboxAccumulator.getEntries()
3544
const failedEntries = await outboxAccumulator.getFailedEntries()
36-
const prismaModel: PrismaClient[typeof this.modelName] = this.prisma[this.modelName]
45+
const prismaModel = this.prisma[this.modelName] as unknown as ModelDelegate
3746

3847
const existingEntries = await prismaModel.findMany({
3948
where: {
@@ -43,12 +52,15 @@ export class OutboxPrismaAdapter<SupportedEvents extends CommonEventDefinition[]
4352
},
4453
})
4554

46-
await this.handleSuccesses(prismaModel, entries, existingEntries)
47-
await this.handleFailures(prismaModel, failedEntries, existingEntries)
55+
await this.prisma.$transaction(async (prisma) => {
56+
const prismaModel = prisma[this.modelName] as ModelDelegate
57+
await this.handleSuccesses(prismaModel, entries, existingEntries)
58+
await this.handleFailures(prismaModel, failedEntries, existingEntries)
59+
})
4860
}
4961

5062
private async handleSuccesses(
51-
prismaModel: PrismaClient[typeof this.modelName],
63+
prismaModel: ModelDelegate,
5264
entries: OutboxEntry<SupportedEvents[number]>[],
5365
existingEntries: OutboxEntry<SupportedEvents[number]>[],
5466
) {
@@ -88,7 +100,7 @@ export class OutboxPrismaAdapter<SupportedEvents extends CommonEventDefinition[]
88100
}
89101

90102
private async handleFailures(
91-
prismaModel: PrismaClient[typeof this.modelName],
103+
prismaModel: ModelDelegate,
92104
entries: OutboxEntry<SupportedEvents[number]>[],
93105
existingEntries: OutboxEntry<SupportedEvents[number]>[],
94106
) {
@@ -132,7 +144,9 @@ export class OutboxPrismaAdapter<SupportedEvents extends CommonEventDefinition[]
132144
}
133145

134146
getEntries(maxRetryCount: number): Promise<OutboxEntry<SupportedEvents[number]>[]> {
135-
return this.prisma[this.modelName].findMany({
147+
const prismaModel = this.prisma[this.modelName] as unknown as ModelDelegate
148+
149+
return prismaModel.findMany({
136150
where: {
137151
retryCount: {
138152
lte: maxRetryCount,

packages/outbox-prisma-adapter/test/outbox-prisma-adapter.spec.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type SupportedEvents = (typeof events)[keyof typeof events][]
2424

2525
describe('outbox-prisma-adapter', () => {
2626
let prisma: PrismaClient
27-
let outboxPrismaAdapter: OutboxPrismaAdapter<SupportedEvents>
27+
let outboxPrismaAdapter: OutboxPrismaAdapter<SupportedEvents, 'outboxEntry'>
2828

2929
const ENTRY_1 = {
3030
id: uuidv7(),
@@ -63,7 +63,10 @@ describe('outbox-prisma-adapter', () => {
6363
log: ['query'],
6464
})
6565

66-
outboxPrismaAdapter = new OutboxPrismaAdapter<SupportedEvents>(prisma, 'OutboxEntry')
66+
outboxPrismaAdapter = new OutboxPrismaAdapter<SupportedEvents, 'outboxEntry'>(
67+
prisma,
68+
'outboxEntry',
69+
)
6770

6871
await prisma.$queryRaw`create schema if not exists prisma;`
6972
await prisma.$queryRaw`

0 commit comments

Comments
 (0)