@pagopa/interop-outbound-models 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +24 -0
- package/.github/workflows/ci.yml +74 -0
- package/.github/workflows/release.yml +26 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +11 -0
- package/CODEOWNERS +2 -0
- package/README.md +0 -0
- package/dist/agreement/eventsV1.d.ts +216 -0
- package/dist/agreement/eventsV1.d.ts.map +1 -0
- package/dist/agreement/eventsV1.js +100 -0
- package/dist/agreement/eventsV2.d.ts +405 -0
- package/dist/agreement/eventsV2.d.ts.map +1 -0
- package/dist/agreement/eventsV2.js +181 -0
- package/dist/agreement/index.d.ts +228 -0
- package/dist/agreement/index.d.ts.map +1 -0
- package/dist/agreement/index.js +36 -0
- package/dist/eservice/eventsV1.d.ts +237 -0
- package/dist/eservice/eventsV1.d.ts.map +1 -0
- package/dist/eservice/eventsV1.js +109 -0
- package/dist/eservice/eventsV2.d.ts +405 -0
- package/dist/eservice/eventsV2.d.ts.map +1 -0
- package/dist/eservice/eventsV2.js +181 -0
- package/dist/eservice/index.d.ts +235 -0
- package/dist/eservice/index.d.ts.map +1 -0
- package/dist/eservice/index.js +36 -0
- package/dist/gen/v1/agreement/agreement.d.ts +294 -0
- package/dist/gen/v1/agreement/agreement.d.ts.map +1 -0
- package/dist/gen/v1/agreement/agreement.js +587 -0
- package/dist/gen/v1/agreement/events.d.ts +212 -0
- package/dist/gen/v1/agreement/events.d.ts.map +1 -0
- package/dist/gen/v1/agreement/events.js +492 -0
- package/dist/gen/v1/eservice/eservice.d.ts +338 -0
- package/dist/gen/v1/eservice/eservice.d.ts.map +1 -0
- package/dist/gen/v1/eservice/eservice.js +629 -0
- package/dist/gen/v1/eservice/events.d.ts +272 -0
- package/dist/gen/v1/eservice/events.d.ts.map +1 -0
- package/dist/gen/v1/eservice/events.js +619 -0
- package/dist/gen/v1/purpose/events.d.ts +235 -0
- package/dist/gen/v1/purpose/events.d.ts.map +1 -0
- package/dist/gen/v1/purpose/events.js +546 -0
- package/dist/gen/v1/purpose/purpose.d.ts +155 -0
- package/dist/gen/v1/purpose/purpose.d.ts.map +1 -0
- package/dist/gen/v1/purpose/purpose.js +274 -0
- package/dist/gen/v1/tenant/events.d.ts +66 -0
- package/dist/gen/v1/tenant/events.d.ts.map +1 -0
- package/dist/gen/v1/tenant/events.js +144 -0
- package/dist/gen/v1/tenant/tenant.d.ts +364 -0
- package/dist/gen/v1/tenant/tenant.d.ts.map +1 -0
- package/dist/gen/v1/tenant/tenant.js +727 -0
- package/dist/gen/v2/agreement/agreement.d.ts +290 -0
- package/dist/gen/v2/agreement/agreement.d.ts.map +1 -0
- package/dist/gen/v2/agreement/agreement.js +583 -0
- package/dist/gen/v2/agreement/events.d.ts +378 -0
- package/dist/gen/v2/agreement/events.d.ts.map +1 -0
- package/dist/gen/v2/agreement/events.js +895 -0
- package/dist/gen/v2/eservice/eservice.d.ts +314 -0
- package/dist/gen/v2/eservice/eservice.d.ts.map +1 -0
- package/dist/gen/v2/eservice/eservice.js +603 -0
- package/dist/gen/v2/eservice/events.d.ts +462 -0
- package/dist/gen/v2/eservice/events.d.ts.map +1 -0
- package/dist/gen/v2/eservice/events.js +1062 -0
- package/dist/gen/v2/purpose/events.d.ts +403 -0
- package/dist/gen/v2/purpose/events.d.ts.map +1 -0
- package/dist/gen/v2/purpose/events.js +937 -0
- package/dist/gen/v2/purpose/purpose.d.ts +147 -0
- package/dist/gen/v2/purpose/purpose.d.ts.map +1 -0
- package/dist/gen/v2/purpose/purpose.js +264 -0
- package/dist/gen/v2/tenant/events.d.ts +278 -0
- package/dist/gen/v2/tenant/events.d.ts.map +1 -0
- package/dist/gen/v2/tenant/events.js +638 -0
- package/dist/gen/v2/tenant/tenant.d.ts +356 -0
- package/dist/gen/v2/tenant/tenant.d.ts.map +1 -0
- package/dist/gen/v2/tenant/tenant.js +722 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/purpose/eventsV1.d.ts +237 -0
- package/dist/purpose/eventsV1.d.ts.map +1 -0
- package/dist/purpose/eventsV1.js +109 -0
- package/dist/purpose/eventsV2.d.ts +384 -0
- package/dist/purpose/eventsV2.d.ts.map +1 -0
- package/dist/purpose/eventsV2.js +172 -0
- package/dist/purpose/index.d.ts +228 -0
- package/dist/purpose/index.d.ts.map +1 -0
- package/dist/purpose/index.js +36 -0
- package/dist/tenant/eventsV1.d.ts +69 -0
- package/dist/tenant/eventsV1.d.ts.map +1 -0
- package/dist/tenant/eventsV1.js +37 -0
- package/dist/tenant/eventsV2.d.ts +258 -0
- package/dist/tenant/eventsV2.d.ts.map +1 -0
- package/dist/tenant/eventsV2.js +118 -0
- package/dist/tenant/index.d.ts +130 -0
- package/dist/tenant/index.d.ts.map +1 -0
- package/dist/tenant/index.js +36 -0
- package/dist/utils.d.ts +17 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +18 -0
- package/package.json +48 -0
- package/proto/v1/agreement/agreement.proto +70 -0
- package/proto/v1/agreement/events.proto +48 -0
- package/proto/v1/eservice/eservice.proto +84 -0
- package/proto/v1/eservice/events.proto +63 -0
- package/proto/v1/purpose/events.proto +53 -0
- package/proto/v1/purpose/purpose.proto +39 -0
- package/proto/v1/tenant/events.proto +17 -0
- package/proto/v1/tenant/tenant.proto +87 -0
- package/proto/v2/agreement/agreement.proto +70 -0
- package/proto/v2/agreement/events.proto +83 -0
- package/proto/v2/eservice/eservice.proto +82 -0
- package/proto/v2/eservice/events.proto +104 -0
- package/proto/v2/purpose/events.proto +90 -0
- package/proto/v2/purpose/purpose.proto +38 -0
- package/proto/v2/tenant/events.proto +63 -0
- package/proto/v2/tenant/tenant.proto +85 -0
- package/src/agreement/eventsV1.ts +136 -0
- package/src/agreement/eventsV2.ts +246 -0
- package/src/agreement/index.ts +45 -0
- package/src/eservice/eventsV1.ts +149 -0
- package/src/eservice/eventsV2.ts +245 -0
- package/src/eservice/index.ts +45 -0
- package/src/index.ts +22 -0
- package/src/purpose/eventsV1.ts +146 -0
- package/src/purpose/eventsV2.ts +228 -0
- package/src/purpose/index.ts +42 -0
- package/src/tenant/eventsV1.ts +51 -0
- package/src/tenant/eventsV2.ts +159 -0
- package/src/tenant/index.ts +43 -0
- package/src/utils.ts +25 -0
- package/tests/agreement.test.ts +28 -0
- package/tests/eservice.test.ts +28 -0
- package/tests/purpose.test.ts +28 -0
- package/tests/tenant.test.ts +28 -0
- package/tsconfig.check.json +7 -0
- package/tsconfig.eslint.json +11 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { match } from "ts-pattern";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {
|
|
4
|
+
PurposeAddedV2,
|
|
5
|
+
DraftPurposeUpdatedV2,
|
|
6
|
+
PurposeWaitingForApprovalV2,
|
|
7
|
+
PurposeActivatedV2,
|
|
8
|
+
DraftPurposeDeletedV2,
|
|
9
|
+
WaitingForApprovalPurposeDeletedV2,
|
|
10
|
+
NewPurposeVersionActivatedV2,
|
|
11
|
+
PurposeVersionActivatedV2,
|
|
12
|
+
PurposeVersionUnsuspendedByProducerV2,
|
|
13
|
+
PurposeVersionUnsuspendedByConsumerV2,
|
|
14
|
+
PurposeVersionSuspendedByProducerV2,
|
|
15
|
+
PurposeVersionSuspendedByConsumerV2,
|
|
16
|
+
NewPurposeVersionWaitingForApprovalV2,
|
|
17
|
+
PurposeVersionOverQuotaUnsuspendedV2,
|
|
18
|
+
PurposeArchivedV2,
|
|
19
|
+
WaitingForApprovalPurposeVersionDeletedV2,
|
|
20
|
+
PurposeVersionRejectedV2,
|
|
21
|
+
PurposeClonedV2,
|
|
22
|
+
} from "../gen/v2/purpose/events.js";
|
|
23
|
+
import { protobufDecoder } from "../utils.js";
|
|
24
|
+
|
|
25
|
+
export function purposeEventToBinaryDataV2(event: PurposeEventV2): Uint8Array {
|
|
26
|
+
return match(event)
|
|
27
|
+
.with({ type: "PurposeAdded" }, ({ data }) => PurposeAddedV2.toBinary(data))
|
|
28
|
+
.with({ type: "DraftPurposeUpdated" }, ({ data }) =>
|
|
29
|
+
DraftPurposeUpdatedV2.toBinary(data)
|
|
30
|
+
)
|
|
31
|
+
.with({ type: "PurposeWaitingForApproval" }, ({ data }) =>
|
|
32
|
+
PurposeWaitingForApprovalV2.toBinary(data)
|
|
33
|
+
)
|
|
34
|
+
.with({ type: "PurposeActivated" }, ({ data }) =>
|
|
35
|
+
PurposeActivatedV2.toBinary(data)
|
|
36
|
+
)
|
|
37
|
+
.with({ type: "DraftPurposeDeleted" }, ({ data }) =>
|
|
38
|
+
DraftPurposeDeletedV2.toBinary(data)
|
|
39
|
+
)
|
|
40
|
+
.with({ type: "WaitingForApprovalPurposeDeleted" }, ({ data }) =>
|
|
41
|
+
WaitingForApprovalPurposeDeletedV2.toBinary(data)
|
|
42
|
+
)
|
|
43
|
+
.with({ type: "NewPurposeVersionActivated" }, ({ data }) =>
|
|
44
|
+
NewPurposeVersionActivatedV2.toBinary(data)
|
|
45
|
+
)
|
|
46
|
+
.with({ type: "PurposeVersionActivated" }, ({ data }) =>
|
|
47
|
+
PurposeVersionActivatedV2.toBinary(data)
|
|
48
|
+
)
|
|
49
|
+
.with({ type: "PurposeVersionUnsuspendedByProducer" }, ({ data }) =>
|
|
50
|
+
PurposeVersionUnsuspendedByProducerV2.toBinary(data)
|
|
51
|
+
)
|
|
52
|
+
.with({ type: "PurposeVersionUnsuspendedByConsumer" }, ({ data }) =>
|
|
53
|
+
PurposeVersionUnsuspendedByConsumerV2.toBinary(data)
|
|
54
|
+
)
|
|
55
|
+
.with({ type: "PurposeVersionSuspendedByProducer" }, ({ data }) =>
|
|
56
|
+
PurposeVersionSuspendedByProducerV2.toBinary(data)
|
|
57
|
+
)
|
|
58
|
+
.with({ type: "PurposeVersionSuspendedByConsumer" }, ({ data }) =>
|
|
59
|
+
PurposeVersionSuspendedByConsumerV2.toBinary(data)
|
|
60
|
+
)
|
|
61
|
+
.with({ type: "NewPurposeVersionWaitingForApproval" }, ({ data }) =>
|
|
62
|
+
NewPurposeVersionWaitingForApprovalV2.toBinary(data)
|
|
63
|
+
)
|
|
64
|
+
.with({ type: "PurposeVersionOverQuotaUnsuspended" }, ({ data }) =>
|
|
65
|
+
PurposeVersionOverQuotaUnsuspendedV2.toBinary(data)
|
|
66
|
+
)
|
|
67
|
+
.with({ type: "PurposeArchived" }, ({ data }) =>
|
|
68
|
+
PurposeArchivedV2.toBinary(data)
|
|
69
|
+
)
|
|
70
|
+
.with({ type: "WaitingForApprovalPurposeVersionDeleted" }, ({ data }) =>
|
|
71
|
+
WaitingForApprovalPurposeVersionDeletedV2.toBinary(data)
|
|
72
|
+
)
|
|
73
|
+
.with({ type: "PurposeVersionRejected" }, ({ data }) =>
|
|
74
|
+
PurposeVersionRejectedV2.toBinary(data)
|
|
75
|
+
)
|
|
76
|
+
.with({ type: "PurposeCloned" }, ({ data }) =>
|
|
77
|
+
PurposeClonedV2.toBinary(data)
|
|
78
|
+
)
|
|
79
|
+
.exhaustive();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export const PurposeEventV2 = z.discriminatedUnion("type", [
|
|
83
|
+
z.object({
|
|
84
|
+
event_version: z.literal(2),
|
|
85
|
+
type: z.literal("PurposeAdded"),
|
|
86
|
+
data: protobufDecoder(PurposeAddedV2),
|
|
87
|
+
stream_id: z.string(),
|
|
88
|
+
version: z.number(),
|
|
89
|
+
timestamp: z.coerce.date(),
|
|
90
|
+
}),
|
|
91
|
+
z.object({
|
|
92
|
+
event_version: z.literal(2),
|
|
93
|
+
type: z.literal("DraftPurposeUpdated"),
|
|
94
|
+
data: protobufDecoder(DraftPurposeUpdatedV2),
|
|
95
|
+
stream_id: z.string(),
|
|
96
|
+
version: z.number(),
|
|
97
|
+
timestamp: z.coerce.date(),
|
|
98
|
+
}),
|
|
99
|
+
z.object({
|
|
100
|
+
event_version: z.literal(2),
|
|
101
|
+
type: z.literal("PurposeWaitingForApproval"),
|
|
102
|
+
data: protobufDecoder(PurposeWaitingForApprovalV2),
|
|
103
|
+
stream_id: z.string(),
|
|
104
|
+
version: z.number(),
|
|
105
|
+
timestamp: z.coerce.date(),
|
|
106
|
+
}),
|
|
107
|
+
z.object({
|
|
108
|
+
event_version: z.literal(2),
|
|
109
|
+
type: z.literal("PurposeActivated"),
|
|
110
|
+
data: protobufDecoder(PurposeActivatedV2),
|
|
111
|
+
stream_id: z.string(),
|
|
112
|
+
version: z.number(),
|
|
113
|
+
timestamp: z.coerce.date(),
|
|
114
|
+
}),
|
|
115
|
+
z.object({
|
|
116
|
+
event_version: z.literal(2),
|
|
117
|
+
type: z.literal("DraftPurposeDeleted"),
|
|
118
|
+
data: protobufDecoder(DraftPurposeDeletedV2),
|
|
119
|
+
stream_id: z.string(),
|
|
120
|
+
version: z.number(),
|
|
121
|
+
timestamp: z.coerce.date(),
|
|
122
|
+
}),
|
|
123
|
+
z.object({
|
|
124
|
+
event_version: z.literal(2),
|
|
125
|
+
type: z.literal("WaitingForApprovalPurposeDeleted"),
|
|
126
|
+
data: protobufDecoder(WaitingForApprovalPurposeDeletedV2),
|
|
127
|
+
stream_id: z.string(),
|
|
128
|
+
version: z.number(),
|
|
129
|
+
timestamp: z.coerce.date(),
|
|
130
|
+
}),
|
|
131
|
+
z.object({
|
|
132
|
+
event_version: z.literal(2),
|
|
133
|
+
type: z.literal("NewPurposeVersionActivated"),
|
|
134
|
+
data: protobufDecoder(NewPurposeVersionActivatedV2),
|
|
135
|
+
stream_id: z.string(),
|
|
136
|
+
version: z.number(),
|
|
137
|
+
timestamp: z.coerce.date(),
|
|
138
|
+
}),
|
|
139
|
+
z.object({
|
|
140
|
+
event_version: z.literal(2),
|
|
141
|
+
type: z.literal("PurposeVersionActivated"),
|
|
142
|
+
data: protobufDecoder(PurposeVersionActivatedV2),
|
|
143
|
+
stream_id: z.string(),
|
|
144
|
+
version: z.number(),
|
|
145
|
+
timestamp: z.coerce.date(),
|
|
146
|
+
}),
|
|
147
|
+
z.object({
|
|
148
|
+
event_version: z.literal(2),
|
|
149
|
+
type: z.literal("PurposeVersionUnsuspendedByProducer"),
|
|
150
|
+
data: protobufDecoder(PurposeVersionUnsuspendedByProducerV2),
|
|
151
|
+
stream_id: z.string(),
|
|
152
|
+
version: z.number(),
|
|
153
|
+
timestamp: z.coerce.date(),
|
|
154
|
+
}),
|
|
155
|
+
z.object({
|
|
156
|
+
event_version: z.literal(2),
|
|
157
|
+
type: z.literal("PurposeVersionUnsuspendedByConsumer"),
|
|
158
|
+
data: protobufDecoder(PurposeVersionUnsuspendedByConsumerV2),
|
|
159
|
+
stream_id: z.string(),
|
|
160
|
+
version: z.number(),
|
|
161
|
+
timestamp: z.coerce.date(),
|
|
162
|
+
}),
|
|
163
|
+
z.object({
|
|
164
|
+
event_version: z.literal(2),
|
|
165
|
+
type: z.literal("PurposeVersionSuspendedByProducer"),
|
|
166
|
+
data: protobufDecoder(PurposeVersionSuspendedByProducerV2),
|
|
167
|
+
stream_id: z.string(),
|
|
168
|
+
version: z.number(),
|
|
169
|
+
timestamp: z.coerce.date(),
|
|
170
|
+
}),
|
|
171
|
+
z.object({
|
|
172
|
+
event_version: z.literal(2),
|
|
173
|
+
type: z.literal("PurposeVersionSuspendedByConsumer"),
|
|
174
|
+
data: protobufDecoder(PurposeVersionSuspendedByConsumerV2),
|
|
175
|
+
stream_id: z.string(),
|
|
176
|
+
version: z.number(),
|
|
177
|
+
timestamp: z.coerce.date(),
|
|
178
|
+
}),
|
|
179
|
+
z.object({
|
|
180
|
+
event_version: z.literal(2),
|
|
181
|
+
type: z.literal("NewPurposeVersionWaitingForApproval"),
|
|
182
|
+
data: protobufDecoder(NewPurposeVersionWaitingForApprovalV2),
|
|
183
|
+
stream_id: z.string(),
|
|
184
|
+
version: z.number(),
|
|
185
|
+
timestamp: z.coerce.date(),
|
|
186
|
+
}),
|
|
187
|
+
z.object({
|
|
188
|
+
event_version: z.literal(2),
|
|
189
|
+
type: z.literal("PurposeVersionOverQuotaUnsuspended"),
|
|
190
|
+
data: protobufDecoder(PurposeVersionOverQuotaUnsuspendedV2),
|
|
191
|
+
stream_id: z.string(),
|
|
192
|
+
version: z.number(),
|
|
193
|
+
timestamp: z.coerce.date(),
|
|
194
|
+
}),
|
|
195
|
+
z.object({
|
|
196
|
+
event_version: z.literal(2),
|
|
197
|
+
type: z.literal("PurposeArchived"),
|
|
198
|
+
data: protobufDecoder(PurposeArchivedV2),
|
|
199
|
+
stream_id: z.string(),
|
|
200
|
+
version: z.number(),
|
|
201
|
+
timestamp: z.coerce.date(),
|
|
202
|
+
}),
|
|
203
|
+
z.object({
|
|
204
|
+
event_version: z.literal(2),
|
|
205
|
+
type: z.literal("WaitingForApprovalPurposeVersionDeleted"),
|
|
206
|
+
data: protobufDecoder(WaitingForApprovalPurposeVersionDeletedV2),
|
|
207
|
+
stream_id: z.string(),
|
|
208
|
+
version: z.number(),
|
|
209
|
+
timestamp: z.coerce.date(),
|
|
210
|
+
}),
|
|
211
|
+
z.object({
|
|
212
|
+
event_version: z.literal(2),
|
|
213
|
+
type: z.literal("PurposeVersionRejected"),
|
|
214
|
+
data: protobufDecoder(PurposeVersionRejectedV2),
|
|
215
|
+
stream_id: z.string(),
|
|
216
|
+
version: z.number(),
|
|
217
|
+
timestamp: z.coerce.date(),
|
|
218
|
+
}),
|
|
219
|
+
z.object({
|
|
220
|
+
event_version: z.literal(2),
|
|
221
|
+
type: z.literal("PurposeCloned"),
|
|
222
|
+
data: protobufDecoder(PurposeClonedV2),
|
|
223
|
+
stream_id: z.string(),
|
|
224
|
+
version: z.number(),
|
|
225
|
+
timestamp: z.coerce.date(),
|
|
226
|
+
}),
|
|
227
|
+
]);
|
|
228
|
+
export type PurposeEventV2 = z.infer<typeof PurposeEventV2>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { match } from "ts-pattern";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { VersionedEvent } from "../utils.js";
|
|
4
|
+
import { PurposeEventV1, purposeEventToBinaryDataV1 } from "./eventsV1.js";
|
|
5
|
+
import { PurposeEventV2, purposeEventToBinaryDataV2 } from "./eventsV2.js";
|
|
6
|
+
|
|
7
|
+
function purposeEventToBinaryData(event: PurposeEvent): Uint8Array {
|
|
8
|
+
return match(event)
|
|
9
|
+
.with({ event_version: 1 }, purposeEventToBinaryDataV1)
|
|
10
|
+
.with({ event_version: 2 }, purposeEventToBinaryDataV2)
|
|
11
|
+
.exhaustive();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function encodeOutboundPurposeEvent(event: PurposeEvent): string {
|
|
15
|
+
return JSON.stringify({
|
|
16
|
+
event_version: event.event_version,
|
|
17
|
+
type: event.type,
|
|
18
|
+
data: purposeEventToBinaryData(event),
|
|
19
|
+
stream_id: event.stream_id,
|
|
20
|
+
version: event.version,
|
|
21
|
+
timestamp: event.timestamp,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function decodeOutboundPurposeEvent(encodedEvent: string): PurposeEvent {
|
|
26
|
+
return PurposeEvent.parse(JSON.parse(encodedEvent));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const PurposeEvent = VersionedEvent.transform((obj, ctx) => {
|
|
30
|
+
const res = match(obj)
|
|
31
|
+
.with({ event_version: 1 }, () => PurposeEventV1.safeParse(obj))
|
|
32
|
+
.with({ event_version: 2 }, () => PurposeEventV2.safeParse(obj))
|
|
33
|
+
.exhaustive();
|
|
34
|
+
|
|
35
|
+
if (!res.success) {
|
|
36
|
+
res.error.issues.forEach(ctx.addIssue);
|
|
37
|
+
return z.NEVER;
|
|
38
|
+
}
|
|
39
|
+
return res.data;
|
|
40
|
+
});
|
|
41
|
+
export type PurposeEvent = z.infer<typeof PurposeEvent>;
|
|
42
|
+
export { PurposeEventV1, PurposeEventV2 };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { match } from "ts-pattern";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {
|
|
4
|
+
TenantCreatedV1,
|
|
5
|
+
TenantUpdatedV1,
|
|
6
|
+
TenantDeletedV1,
|
|
7
|
+
} from "../gen/v1/tenant/events.js";
|
|
8
|
+
import { protobufDecoder } from "../utils.js";
|
|
9
|
+
|
|
10
|
+
export function tenantEventToBinaryDataV1(event: TenantEventV1): Uint8Array {
|
|
11
|
+
return match(event)
|
|
12
|
+
.with({ type: "TenantCreated" }, ({ data }) =>
|
|
13
|
+
TenantCreatedV1.toBinary(data)
|
|
14
|
+
)
|
|
15
|
+
.with({ type: "TenantUpdated" }, ({ data }) =>
|
|
16
|
+
TenantUpdatedV1.toBinary(data)
|
|
17
|
+
)
|
|
18
|
+
.with({ type: "TenantDeleted" }, ({ data }) =>
|
|
19
|
+
TenantDeletedV1.toBinary(data)
|
|
20
|
+
)
|
|
21
|
+
.exhaustive();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const TenantEventV1 = z.discriminatedUnion("type", [
|
|
25
|
+
z.object({
|
|
26
|
+
event_version: z.literal(1),
|
|
27
|
+
type: z.literal("TenantCreated"),
|
|
28
|
+
data: protobufDecoder(TenantCreatedV1),
|
|
29
|
+
stream_id: z.string(),
|
|
30
|
+
version: z.number(),
|
|
31
|
+
timestamp: z.coerce.date(),
|
|
32
|
+
}),
|
|
33
|
+
z.object({
|
|
34
|
+
event_version: z.literal(1),
|
|
35
|
+
type: z.literal("TenantUpdated"),
|
|
36
|
+
data: protobufDecoder(TenantUpdatedV1),
|
|
37
|
+
stream_id: z.string(),
|
|
38
|
+
version: z.number(),
|
|
39
|
+
timestamp: z.coerce.date(),
|
|
40
|
+
}),
|
|
41
|
+
z.object({
|
|
42
|
+
event_version: z.literal(1),
|
|
43
|
+
type: z.literal("TenantDeleted"),
|
|
44
|
+
data: protobufDecoder(TenantDeletedV1),
|
|
45
|
+
stream_id: z.string(),
|
|
46
|
+
version: z.number(),
|
|
47
|
+
timestamp: z.coerce.date(),
|
|
48
|
+
}),
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
export type TenantEventV1 = z.infer<typeof TenantEventV1>;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { match } from "ts-pattern";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {
|
|
4
|
+
TenantOnboardedV2,
|
|
5
|
+
TenantOnboardDetailsUpdatedV2,
|
|
6
|
+
TenantCertifiedAttributeAssignedV2,
|
|
7
|
+
TenantCertifiedAttributeRevokedV2,
|
|
8
|
+
TenantDeclaredAttributeAssignedV2,
|
|
9
|
+
TenantDeclaredAttributeRevokedV2,
|
|
10
|
+
TenantVerifiedAttributeAssignedV2,
|
|
11
|
+
TenantVerifiedAttributeRevokedV2,
|
|
12
|
+
TenantVerifiedAttributeExpirationUpdatedV2,
|
|
13
|
+
MaintenanceTenantDeletedV2,
|
|
14
|
+
TenantVerifiedAttributeExtensionUpdatedV2,
|
|
15
|
+
TenantKindUpdatedV2,
|
|
16
|
+
} from "../gen/v2/tenant/events.js";
|
|
17
|
+
import { protobufDecoder } from "../utils.js";
|
|
18
|
+
|
|
19
|
+
export function tenantEventToBinaryDataV2(event: TenantEventV2): Uint8Array {
|
|
20
|
+
return match(event)
|
|
21
|
+
.with({ type: "TenantOnboarded" }, ({ data }) =>
|
|
22
|
+
TenantOnboardedV2.toBinary(data)
|
|
23
|
+
)
|
|
24
|
+
.with({ type: "TenantOnboardDetailsUpdated" }, ({ data }) =>
|
|
25
|
+
TenantOnboardDetailsUpdatedV2.toBinary(data)
|
|
26
|
+
)
|
|
27
|
+
.with({ type: "TenantCertifiedAttributeAssigned" }, ({ data }) =>
|
|
28
|
+
TenantCertifiedAttributeAssignedV2.toBinary(data)
|
|
29
|
+
)
|
|
30
|
+
.with({ type: "TenantCertifiedAttributeRevoked" }, ({ data }) =>
|
|
31
|
+
TenantCertifiedAttributeRevokedV2.toBinary(data)
|
|
32
|
+
)
|
|
33
|
+
.with({ type: "TenantDeclaredAttributeAssigned" }, ({ data }) =>
|
|
34
|
+
TenantDeclaredAttributeAssignedV2.toBinary(data)
|
|
35
|
+
)
|
|
36
|
+
.with({ type: "TenantDeclaredAttributeRevoked" }, ({ data }) =>
|
|
37
|
+
TenantDeclaredAttributeRevokedV2.toBinary(data)
|
|
38
|
+
)
|
|
39
|
+
.with({ type: "TenantVerifiedAttributeAssigned" }, ({ data }) =>
|
|
40
|
+
TenantVerifiedAttributeAssignedV2.toBinary(data)
|
|
41
|
+
)
|
|
42
|
+
.with({ type: "TenantVerifiedAttributeRevoked" }, ({ data }) =>
|
|
43
|
+
TenantVerifiedAttributeRevokedV2.toBinary(data)
|
|
44
|
+
)
|
|
45
|
+
.with({ type: "TenantVerifiedAttributeExpirationUpdated" }, ({ data }) =>
|
|
46
|
+
TenantVerifiedAttributeExpirationUpdatedV2.toBinary(data)
|
|
47
|
+
)
|
|
48
|
+
.with({ type: "TenantVerifiedAttributeExtensionUpdated" }, ({ data }) =>
|
|
49
|
+
TenantVerifiedAttributeExtensionUpdatedV2.toBinary(data)
|
|
50
|
+
)
|
|
51
|
+
.with({ type: "MaintenanceTenantDeleted" }, ({ data }) =>
|
|
52
|
+
MaintenanceTenantDeletedV2.toBinary(data)
|
|
53
|
+
)
|
|
54
|
+
.with({ type: "TenantKindUpdated" }, ({ data }) =>
|
|
55
|
+
TenantKindUpdatedV2.toBinary(data)
|
|
56
|
+
)
|
|
57
|
+
.exhaustive();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const TenantEventV2 = z.discriminatedUnion("type", [
|
|
61
|
+
z.object({
|
|
62
|
+
event_version: z.literal(2),
|
|
63
|
+
type: z.literal("TenantOnboarded"),
|
|
64
|
+
data: protobufDecoder(TenantOnboardedV2),
|
|
65
|
+
stream_id: z.string(),
|
|
66
|
+
version: z.number(),
|
|
67
|
+
timestamp: z.coerce.date(),
|
|
68
|
+
}),
|
|
69
|
+
z.object({
|
|
70
|
+
event_version: z.literal(2),
|
|
71
|
+
type: z.literal("TenantOnboardDetailsUpdated"),
|
|
72
|
+
data: protobufDecoder(TenantOnboardDetailsUpdatedV2),
|
|
73
|
+
stream_id: z.string(),
|
|
74
|
+
version: z.number(),
|
|
75
|
+
timestamp: z.coerce.date(),
|
|
76
|
+
}),
|
|
77
|
+
z.object({
|
|
78
|
+
event_version: z.literal(2),
|
|
79
|
+
type: z.literal("TenantCertifiedAttributeAssigned"),
|
|
80
|
+
data: protobufDecoder(TenantCertifiedAttributeAssignedV2),
|
|
81
|
+
stream_id: z.string(),
|
|
82
|
+
version: z.number(),
|
|
83
|
+
timestamp: z.coerce.date(),
|
|
84
|
+
}),
|
|
85
|
+
z.object({
|
|
86
|
+
event_version: z.literal(2),
|
|
87
|
+
type: z.literal("TenantCertifiedAttributeRevoked"),
|
|
88
|
+
data: protobufDecoder(TenantCertifiedAttributeRevokedV2),
|
|
89
|
+
stream_id: z.string(),
|
|
90
|
+
version: z.number(),
|
|
91
|
+
timestamp: z.coerce.date(),
|
|
92
|
+
}),
|
|
93
|
+
z.object({
|
|
94
|
+
event_version: z.literal(2),
|
|
95
|
+
type: z.literal("TenantDeclaredAttributeAssigned"),
|
|
96
|
+
data: protobufDecoder(TenantDeclaredAttributeAssignedV2),
|
|
97
|
+
stream_id: z.string(),
|
|
98
|
+
version: z.number(),
|
|
99
|
+
timestamp: z.coerce.date(),
|
|
100
|
+
}),
|
|
101
|
+
z.object({
|
|
102
|
+
event_version: z.literal(2),
|
|
103
|
+
type: z.literal("TenantDeclaredAttributeRevoked"),
|
|
104
|
+
data: protobufDecoder(TenantDeclaredAttributeRevokedV2),
|
|
105
|
+
stream_id: z.string(),
|
|
106
|
+
version: z.number(),
|
|
107
|
+
timestamp: z.coerce.date(),
|
|
108
|
+
}),
|
|
109
|
+
z.object({
|
|
110
|
+
event_version: z.literal(2),
|
|
111
|
+
type: z.literal("TenantVerifiedAttributeAssigned"),
|
|
112
|
+
data: protobufDecoder(TenantVerifiedAttributeAssignedV2),
|
|
113
|
+
stream_id: z.string(),
|
|
114
|
+
version: z.number(),
|
|
115
|
+
timestamp: z.coerce.date(),
|
|
116
|
+
}),
|
|
117
|
+
z.object({
|
|
118
|
+
event_version: z.literal(2),
|
|
119
|
+
type: z.literal("TenantVerifiedAttributeRevoked"),
|
|
120
|
+
data: protobufDecoder(TenantVerifiedAttributeRevokedV2),
|
|
121
|
+
stream_id: z.string(),
|
|
122
|
+
version: z.number(),
|
|
123
|
+
timestamp: z.coerce.date(),
|
|
124
|
+
}),
|
|
125
|
+
z.object({
|
|
126
|
+
event_version: z.literal(2),
|
|
127
|
+
type: z.literal("TenantVerifiedAttributeExpirationUpdated"),
|
|
128
|
+
data: protobufDecoder(TenantVerifiedAttributeExpirationUpdatedV2),
|
|
129
|
+
stream_id: z.string(),
|
|
130
|
+
version: z.number(),
|
|
131
|
+
timestamp: z.coerce.date(),
|
|
132
|
+
}),
|
|
133
|
+
z.object({
|
|
134
|
+
event_version: z.literal(2),
|
|
135
|
+
type: z.literal("TenantVerifiedAttributeExtensionUpdated"),
|
|
136
|
+
data: protobufDecoder(TenantVerifiedAttributeExtensionUpdatedV2),
|
|
137
|
+
stream_id: z.string(),
|
|
138
|
+
version: z.number(),
|
|
139
|
+
timestamp: z.coerce.date(),
|
|
140
|
+
}),
|
|
141
|
+
z.object({
|
|
142
|
+
event_version: z.literal(2),
|
|
143
|
+
type: z.literal("MaintenanceTenantDeleted"),
|
|
144
|
+
data: protobufDecoder(MaintenanceTenantDeletedV2),
|
|
145
|
+
stream_id: z.string(),
|
|
146
|
+
version: z.number(),
|
|
147
|
+
timestamp: z.coerce.date(),
|
|
148
|
+
}),
|
|
149
|
+
z.object({
|
|
150
|
+
event_version: z.literal(2),
|
|
151
|
+
type: z.literal("TenantKindUpdated"),
|
|
152
|
+
data: protobufDecoder(TenantKindUpdatedV2),
|
|
153
|
+
stream_id: z.string(),
|
|
154
|
+
version: z.number(),
|
|
155
|
+
timestamp: z.coerce.date(),
|
|
156
|
+
}),
|
|
157
|
+
]);
|
|
158
|
+
|
|
159
|
+
export type TenantEventV2 = z.infer<typeof TenantEventV2>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { match } from "ts-pattern";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { VersionedEvent } from "../utils.js";
|
|
4
|
+
import { TenantEventV1, tenantEventToBinaryDataV1 } from "./eventsV1.js";
|
|
5
|
+
import { TenantEventV2, tenantEventToBinaryDataV2 } from "./eventsV2.js";
|
|
6
|
+
|
|
7
|
+
function tenantEventToBinaryData(event: TenantEvent): Uint8Array {
|
|
8
|
+
return match(event)
|
|
9
|
+
.with({ event_version: 1 }, tenantEventToBinaryDataV1)
|
|
10
|
+
.with({ event_version: 2 }, tenantEventToBinaryDataV2)
|
|
11
|
+
.exhaustive();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function encodeOutboundTenantEvent(event: TenantEvent): string {
|
|
15
|
+
return JSON.stringify({
|
|
16
|
+
event_version: event.event_version,
|
|
17
|
+
type: event.type,
|
|
18
|
+
data: tenantEventToBinaryData(event),
|
|
19
|
+
stream_id: event.stream_id,
|
|
20
|
+
version: event.version,
|
|
21
|
+
timestamp: event.timestamp,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function decodeOutboundTenantEvent(encodedEvent: string): TenantEvent {
|
|
26
|
+
return TenantEvent.parse(JSON.parse(encodedEvent));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const TenantEvent = VersionedEvent.transform((obj, ctx) => {
|
|
30
|
+
const res = match(obj)
|
|
31
|
+
.with({ event_version: 1 }, () => TenantEventV1.safeParse(obj))
|
|
32
|
+
.with({ event_version: 2 }, () => TenantEventV2.safeParse(obj))
|
|
33
|
+
.exhaustive();
|
|
34
|
+
|
|
35
|
+
if (!res.success) {
|
|
36
|
+
res.error.issues.forEach(ctx.addIssue);
|
|
37
|
+
return z.NEVER;
|
|
38
|
+
}
|
|
39
|
+
return res.data;
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export type TenantEvent = z.infer<typeof TenantEvent>;
|
|
43
|
+
export { TenantEventV1, TenantEventV2 };
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MessageType } from "@protobuf-ts/runtime";
|
|
2
|
+
import { ZodAny, ZodTransformer, z } from "zod";
|
|
3
|
+
|
|
4
|
+
export const VersionedEvent = z.discriminatedUnion("event_version", [
|
|
5
|
+
z
|
|
6
|
+
.object({
|
|
7
|
+
event_version: z.literal(1),
|
|
8
|
+
})
|
|
9
|
+
.passthrough(),
|
|
10
|
+
z
|
|
11
|
+
.object({
|
|
12
|
+
event_version: z.literal(2),
|
|
13
|
+
})
|
|
14
|
+
.passthrough(),
|
|
15
|
+
]);
|
|
16
|
+
|
|
17
|
+
export function protobufDecoder<I extends object>(
|
|
18
|
+
decoder: MessageType<I>
|
|
19
|
+
): ZodTransformer<ZodAny, I> {
|
|
20
|
+
return z
|
|
21
|
+
.any()
|
|
22
|
+
.transform((v) =>
|
|
23
|
+
decoder.fromBinary(Buffer.from(Object.values(v) as never, "hex"))
|
|
24
|
+
);
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
encodeOutboundAgreementEvent,
|
|
4
|
+
decodeOutboundAgreementEvent,
|
|
5
|
+
AgreementEvent,
|
|
6
|
+
} from "../src/index.js";
|
|
7
|
+
|
|
8
|
+
describe("agreement", () => {
|
|
9
|
+
it("should correctly encode and decode AgreementDeleted event", () => {
|
|
10
|
+
const event: AgreementEvent = {
|
|
11
|
+
event_version: 1,
|
|
12
|
+
type: "AgreementDeleted",
|
|
13
|
+
data: {
|
|
14
|
+
agreementId: "123",
|
|
15
|
+
},
|
|
16
|
+
stream_id: "123",
|
|
17
|
+
timestamp: new Date(),
|
|
18
|
+
version: 1,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const encoded = encodeOutboundAgreementEvent(event);
|
|
22
|
+
const decoded = decodeOutboundAgreementEvent(encoded);
|
|
23
|
+
|
|
24
|
+
expect(decoded).toEqual(event);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// TODO: Add more tests for other event types
|
|
28
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
encodeOutboundEServiceEvent,
|
|
4
|
+
decodeOutboundEServiceEvent,
|
|
5
|
+
EServiceEvent,
|
|
6
|
+
} from "../src/index.js";
|
|
7
|
+
|
|
8
|
+
describe("eservice", () => {
|
|
9
|
+
it("should correctly encode and decode EServiceDeleted event", () => {
|
|
10
|
+
const event: EServiceEvent = {
|
|
11
|
+
event_version: 1,
|
|
12
|
+
type: "EServiceDeleted",
|
|
13
|
+
data: {
|
|
14
|
+
eserviceId: "123",
|
|
15
|
+
},
|
|
16
|
+
stream_id: "123",
|
|
17
|
+
timestamp: new Date(),
|
|
18
|
+
version: 1,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const encoded = encodeOutboundEServiceEvent(event);
|
|
22
|
+
const decoded = decodeOutboundEServiceEvent(encoded);
|
|
23
|
+
|
|
24
|
+
expect(decoded).toEqual(event);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// TODO: Add more tests for other event types
|
|
28
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
encodeOutboundPurposeEvent,
|
|
4
|
+
decodeOutboundPurposeEvent,
|
|
5
|
+
PurposeEvent,
|
|
6
|
+
} from "../src/index.js";
|
|
7
|
+
|
|
8
|
+
describe("purpose", () => {
|
|
9
|
+
it("should correctly encode and decode PurposeDeleted event", () => {
|
|
10
|
+
const event: PurposeEvent = {
|
|
11
|
+
event_version: 1,
|
|
12
|
+
type: "PurposeDeleted",
|
|
13
|
+
data: {
|
|
14
|
+
purposeId: "123",
|
|
15
|
+
},
|
|
16
|
+
stream_id: "123",
|
|
17
|
+
timestamp: new Date(),
|
|
18
|
+
version: 1,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const encoded = encodeOutboundPurposeEvent(event);
|
|
22
|
+
const decoded = decodeOutboundPurposeEvent(encoded);
|
|
23
|
+
|
|
24
|
+
expect(decoded).toEqual(event);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// TODO: Add more tests for other event types
|
|
28
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
encodeOutboundTenantEvent,
|
|
4
|
+
decodeOutboundTenantEvent,
|
|
5
|
+
TenantEvent,
|
|
6
|
+
} from "../src/index.js";
|
|
7
|
+
|
|
8
|
+
describe("tenant", () => {
|
|
9
|
+
it("should correctly encode and decode TenantDeleted event", () => {
|
|
10
|
+
const event: TenantEvent = {
|
|
11
|
+
event_version: 1,
|
|
12
|
+
type: "TenantDeleted",
|
|
13
|
+
data: {
|
|
14
|
+
tenantId: "123",
|
|
15
|
+
},
|
|
16
|
+
stream_id: "123",
|
|
17
|
+
timestamp: new Date(),
|
|
18
|
+
version: 1,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const encoded = encodeOutboundTenantEvent(event);
|
|
22
|
+
const decoded = decodeOutboundTenantEvent(encoded);
|
|
23
|
+
|
|
24
|
+
expect(decoded).toEqual(event);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// TODO: Add more tests for other event types
|
|
28
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Root tsconfig for typescript-eslint
|
|
2
|
+
// See: https://typescript-eslint.io/getting-started/typed-linting/monorepos#important-note-regarding-large--10-multi-package-monorepos
|
|
3
|
+
// Choosing the root tsconfig approach because of: https://typescript-eslint.io/getting-started/typed-linting/monorepos#important-note-regarding-large--10-multi-package-monorepos
|
|
4
|
+
{
|
|
5
|
+
"extends": "./tsconfig.json",
|
|
6
|
+
"compilerOptions": {
|
|
7
|
+
// ensure that nobody can accidentally use this config for a build
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
},
|
|
10
|
+
"include": ["src", "tests"]
|
|
11
|
+
}
|