@@ -25,52 +25,110 @@ export class OutboxPrismaAdapter<SupportedEvents extends CommonEventDefinition[]
25
25
updated : outboxEntry . updated ,
26
26
data : outboxEntry . data ,
27
27
status : outboxEntry . status ,
28
+ retryCount : outboxEntry . retryCount ,
28
29
} ,
29
30
} )
30
31
}
31
32
32
33
async flush ( outboxAccumulator : OutboxAccumulator < SupportedEvents > ) : Promise < void > {
33
34
const entries = await outboxAccumulator . getEntries ( )
34
-
35
+ const failedEntries = await outboxAccumulator . getFailedEntries ( )
35
36
const prismaModel : PrismaClient [ typeof this . modelName ] = this . prisma [ this . modelName ]
36
37
37
38
const existingEntries = await prismaModel . findMany ( {
38
39
where : {
39
40
id : {
40
- in : entries . map ( ( entry ) => entry . id ) ,
41
+ in : [ ... entries . map ( ( entry ) => entry . id ) , ... failedEntries . map ( ( entry ) => entry . id ) ] ,
41
42
} ,
42
43
} ,
43
44
} )
44
45
46
+ await this . handleSuccesses ( prismaModel , entries , existingEntries )
47
+ await this . handleFailures ( prismaModel , failedEntries , existingEntries )
48
+ }
49
+
50
+ private async handleSuccesses (
51
+ prismaModel : PrismaClient [ typeof this . modelName ] ,
52
+ entries : OutboxEntry < SupportedEvents [ number ] > [ ] ,
53
+ existingEntries : OutboxEntry < SupportedEvents [ number ] > [ ] ,
54
+ ) {
45
55
const toCreate = entries . filter (
46
56
( entry ) => ! existingEntries . some ( ( existingEntry ) => existingEntry . id === entry . id ) ,
47
57
)
48
58
const toUpdate = entries . filter ( ( entry ) =>
49
59
existingEntries . some ( ( existingEntry ) => existingEntry . id === entry . id ) ,
50
60
)
51
61
52
- await prismaModel . createMany ( {
53
- data : toCreate . map ( ( entry ) => ( {
54
- id : entry . id ,
55
- type : getMessageType ( entry . event ) ,
56
- created : entry . created ,
57
- updated : new Date ( ) ,
58
- data : entry . data ,
59
- status : 'SUCCESS' ,
60
- } ) ) ,
61
- } )
62
+ if ( toCreate . length > 0 ) {
63
+ await prismaModel . createMany ( {
64
+ data : toCreate . map ( ( entry ) => ( {
65
+ id : entry . id ,
66
+ type : getMessageType ( entry . event ) ,
67
+ created : entry . created ,
68
+ updated : new Date ( ) ,
69
+ data : entry . data ,
70
+ status : 'SUCCESS' ,
71
+ } ) ) ,
72
+ } )
73
+ }
62
74
63
- await prismaModel . updateMany ( {
64
- where : {
65
- id : {
66
- in : toUpdate . map ( ( entry ) => entry . id ) ,
75
+ if ( toUpdate . length > 0 ) {
76
+ await prismaModel . updateMany ( {
77
+ where : {
78
+ id : {
79
+ in : toUpdate . map ( ( entry ) => entry . id ) ,
80
+ } ,
67
81
} ,
68
- } ,
69
- data : {
70
- status : 'SUCCESS' ,
71
- updated : new Date ( ) ,
72
- } ,
73
- } )
82
+ data : {
83
+ status : 'SUCCESS' ,
84
+ updated : new Date ( ) ,
85
+ } ,
86
+ } )
87
+ }
88
+ }
89
+
90
+ private async handleFailures (
91
+ prismaModel : PrismaClient [ typeof this . modelName ] ,
92
+ entries : OutboxEntry < SupportedEvents [ number ] > [ ] ,
93
+ existingEntries : OutboxEntry < SupportedEvents [ number ] > [ ] ,
94
+ ) {
95
+ const toCreate = entries . filter (
96
+ ( entry ) => ! existingEntries . some ( ( existingEntry ) => existingEntry . id === entry . id ) ,
97
+ )
98
+ const toUpdate = entries . filter ( ( entry ) =>
99
+ existingEntries . some ( ( existingEntry ) => existingEntry . id === entry . id ) ,
100
+ )
101
+
102
+ if ( toCreate . length > 0 ) {
103
+ await prismaModel . createMany ( {
104
+ data : toCreate . map ( ( entry ) => ( {
105
+ id : entry . id ,
106
+ type : getMessageType ( entry . event ) ,
107
+ created : entry . created ,
108
+ updated : new Date ( ) ,
109
+ data : entry . data ,
110
+ status : 'FAILED' ,
111
+ retryCount : 1 ,
112
+ } ) ) ,
113
+ } )
114
+ }
115
+
116
+ if ( toUpdate . length > 0 ) {
117
+ await prismaModel . updateMany ( {
118
+ where : {
119
+ id : {
120
+ in : toUpdate . map ( ( entry ) => entry . id ) ,
121
+ } ,
122
+ } ,
123
+ data : {
124
+ status : 'FAILED' ,
125
+ updated : new Date ( ) ,
126
+ retryCount : {
127
+ increment : 1 ,
128
+ } ,
129
+ } ,
130
+ } )
131
+ }
74
132
}
75
133
76
134
getEntries ( maxRetryCount : number ) : Promise < OutboxEntry < SupportedEvents [ number ] > [ ] > {
0 commit comments