@devizovaburza/mdm-sdk 0.0.12 → 0.0.13

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/dist/v1/index.cjs CHANGED
@@ -9,6 +9,8 @@ const z = require('zod/v4/core');
9
9
  require('node:fs');
10
10
  require('node:crypto');
11
11
  require('node:path');
12
+ const factory = require('hono/factory');
13
+ const httpException = require('hono/http-exception');
12
14
 
13
15
  function _interopNamespaceCompat(e) {
14
16
  if (e && typeof e === 'object' && 'default' in e) return e;
@@ -12904,7 +12906,7 @@ const recipientSelectSchema = bankAccountSelectSchema;
12904
12906
 
12905
12907
  createInsertSchema(party);
12906
12908
  createUpdateSchema(party);
12907
- const partySchema$1 = zodOpenapi.z.object({
12909
+ const partySchema$2 = zodOpenapi.z.object({
12908
12910
  partyType: zodOpenapi.z.enum(PartyTypeZod),
12909
12911
  language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
12910
12912
  id: zodOpenapi.z.uuid().nullable(),
@@ -12925,7 +12927,7 @@ const partyOutputSchema$1 = zodOpenapi.z.object({
12925
12927
  createdAt: zodOpenapi.z.date().nullable(),
12926
12928
  updatedAt: zodOpenapi.z.date().nullable()
12927
12929
  });
12928
- const createPartySchema = partySchema$1.omit({ id: true });
12930
+ const createPartySchema = partySchema$2.omit({ id: true });
12929
12931
  zodOpenapi.z.object({
12930
12932
  party: createPartySchema,
12931
12933
  personalData: individualInsertSchema$1.omit({ partyId: true }).nullable(),
@@ -12938,7 +12940,7 @@ zodOpenapi.z.object({
12938
12940
  });
12939
12941
  zodOpenapi.z.object({
12940
12942
  partyId: zodOpenapi.z.uuid(),
12941
- party: partySchema$1,
12943
+ party: partySchema$2,
12942
12944
  personalData: individualUpdateSchema$1.optional(),
12943
12945
  organizationData: organizationUpdateSchema$1.optional(),
12944
12946
  bankAccounts: zodOpenapi.z.array(bankAccountUpsertSchema).optional(),
@@ -13199,7 +13201,7 @@ zod.z.object({
13199
13201
  id: zod.z.uuid()
13200
13202
  });
13201
13203
 
13202
- const ALLOWED_ID_DOCUMENTS_FILTERS = {
13204
+ const ALLOWED_ID_DOCUMENTS_FILTERS$1 = {
13203
13205
  PARTY_ID: "filterIdDocumentPartyId",
13204
13206
  ISSUER: "filterIdDocumentIssuer"
13205
13207
  };
@@ -13211,8 +13213,8 @@ zod.z.object({
13211
13213
  column: zod.z.string(),
13212
13214
  direction: zod.z.enum(["asc", "desc"])
13213
13215
  }),
13214
- [ALLOWED_ID_DOCUMENTS_FILTERS.PARTY_ID]: zod.z.union([zod.z.uuid(), zod.z.uuid().array()]).optional(),
13215
- [ALLOWED_ID_DOCUMENTS_FILTERS.ISSUER]: zod.z.union([zod.z.string(), zod.z.string().array()]).optional(),
13216
+ [ALLOWED_ID_DOCUMENTS_FILTERS$1.PARTY_ID]: zod.z.union([zod.z.uuid(), zod.z.uuid().array()]).optional(),
13217
+ [ALLOWED_ID_DOCUMENTS_FILTERS$1.ISSUER]: zod.z.union([zod.z.string(), zod.z.string().array()]).optional(),
13216
13218
  search: zod.z.string().optional()
13217
13219
  })
13218
13220
  });
@@ -13269,8 +13271,49 @@ zod.z.object({
13269
13271
  id: zod.z.uuid()
13270
13272
  });
13271
13273
 
13274
+ const routeError = zodOpenapi.z.object({
13275
+ message: zodOpenapi.z.string(),
13276
+ data: zodOpenapi.z.null(),
13277
+ errorDetail: zodOpenapi.z.object({
13278
+ message: zodOpenapi.z.string(),
13279
+ code: zodOpenapi.z.number()
13280
+ }).optional(),
13281
+ error: zodOpenapi.z.boolean()
13282
+ });
13283
+ const errorResponse = (entityName, action = "creation") => ({
13284
+ 404: {
13285
+ content: {
13286
+ "application/json": {
13287
+ schema: zodOpenapi.z.object({
13288
+ message: zodOpenapi.z.string(),
13289
+ stackTrace: zodOpenapi.z.string().optional()
13290
+ })
13291
+ }
13292
+ },
13293
+ description: `Not Found. This can occur when the ${entityName} is not found.`
13294
+ },
13295
+ 500: {
13296
+ content: {
13297
+ "application/json": {
13298
+ schema: zodOpenapi.z.object({
13299
+ message: zodOpenapi.z.string(),
13300
+ stackTrace: zodOpenapi.z.string().optional()
13301
+ })
13302
+ }
13303
+ },
13304
+ description: `Internal Server Error. This can occur when the ${entityName} ${action} fails.`
13305
+ }
13306
+ });
13307
+
13308
+ const partySchema$1 = zodOpenapi.z.object({
13309
+ partyType: zodOpenapi.z.enum(PartyTypeZod),
13310
+ language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
13311
+ id: zodOpenapi.z.uuid(),
13312
+ internalId: zodOpenapi.z.string().optional(),
13313
+ note: zodOpenapi.z.string().optional(),
13314
+ countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional()
13315
+ });
13272
13316
  const individualInsertSchema = zodOpenapi.z.object({
13273
- partyId: zodOpenapi.z.uuid(),
13274
13317
  internalId: zodOpenapi.z.string().optional(),
13275
13318
  name: zodOpenapi.z.string(),
13276
13319
  surname: zodOpenapi.z.string(),
@@ -13297,6 +13340,173 @@ const individualInsertSchema = zodOpenapi.z.object({
13297
13340
  stayAbroad: zodOpenapi.z.boolean().optional(),
13298
13341
  stayAbroadCountries: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional()
13299
13342
  });
13343
+ const createOrganizationInputSchema = zodOpenapi.z.object({
13344
+ internalId: zodOpenapi.z.string().optional(),
13345
+ businessName: zodOpenapi.z.string(),
13346
+ email: zodOpenapi.z.string().optional(),
13347
+ phone: zodOpenapi.z.string().optional(),
13348
+ registeredNumber: zodOpenapi.z.string(),
13349
+ registeredIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13350
+ operatesIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13351
+ presentIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13352
+ monthlyVolumeIn: zodOpenapi.z.number(),
13353
+ monthlyVolumeOut: zodOpenapi.z.number(),
13354
+ ownedBy: zodOpenapi.z.string(),
13355
+ companyObjects: zodOpenapi.z.string(),
13356
+ annualTurnover: zodOpenapi.z.number(),
13357
+ numberOfEmployees: zodOpenapi.z.number(),
13358
+ prosecuted: zodOpenapi.z.string().optional(),
13359
+ location: zodOpenapi.z.string().optional(),
13360
+ fileNumber: zodOpenapi.z.string().optional(),
13361
+ websiteUrl: zodOpenapi.z.string().optional(),
13362
+ vatPayer: zodOpenapi.z.boolean(),
13363
+ companyObjectsDescription: zodOpenapi.z.string(),
13364
+ turnover3years: zodOpenapi.z.number(),
13365
+ operationCountries: zodOpenapi.z.string(),
13366
+ riskyBusinessType: zodOpenapi.z.string().optional()
13367
+ });
13368
+ const updateBankAccountSchema$1 = zodOpenapi.z.object({
13369
+ ...bankAccountMetadataSchema.shape,
13370
+ partyId: zodOpenapi.z.uuid(),
13371
+ internalId: zodOpenapi.z.string().optional(),
13372
+ holderName: zodOpenapi.z.string(),
13373
+ number: zodOpenapi.z.string().optional(),
13374
+ currency: bankAccountMetadataSchema.shape.currency.nonoptional(),
13375
+ countryCode: bankAccountMetadataSchema.shape.countryCode.nonoptional(),
13376
+ id: bankAccountMetadataSchema.shape.id.nonoptional()
13377
+ });
13378
+ const bankAccountInputSchema = updateBankAccountSchema$1.required({
13379
+ holderName: true,
13380
+ currency: true,
13381
+ countryCode: true
13382
+ }).omit({ id: true, partyId: true });
13383
+ const disponentSchema = zodOpenapi.z.discriminatedUnion("partyType", [
13384
+ zodOpenapi.z.object({
13385
+ partyType: zodOpenapi.z.literal("INDIVIDUAL"),
13386
+ data: individualInsertSchema
13387
+ }),
13388
+ zodOpenapi.z.object({
13389
+ partyType: zodOpenapi.z.literal("ORGANIZATION"),
13390
+ data: createOrganizationInputSchema
13391
+ })
13392
+ ]);
13393
+ const createAddressInputSchema = zodOpenapi.z.object({
13394
+ addressType: zodOpenapi.z.enum(AddressTypeZod),
13395
+ internalId: zodOpenapi.z.string().optional(),
13396
+ street: zodOpenapi.z.string(),
13397
+ orientationNumber: zodOpenapi.z.string().optional(),
13398
+ descriptiveNumber: zodOpenapi.z.string().optional(),
13399
+ municipality: zodOpenapi.z.string().max(255),
13400
+ municipalityPart: zodOpenapi.z.string().optional(),
13401
+ zipCode: zodOpenapi.z.string().max(20),
13402
+ district: zodOpenapi.z.string().max(255),
13403
+ region: zodOpenapi.z.string().max(255),
13404
+ countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13405
+ ruianCode: zodOpenapi.z.string().optional()
13406
+ });
13407
+ const createAmlInputSchema = zodOpenapi.z.object({
13408
+ internalId: zodOpenapi.z.string().optional(),
13409
+ sourceOfWealth: zodOpenapi.z.string(),
13410
+ yearlyIncome: zodOpenapi.z.string(),
13411
+ tradesPurpose: zodOpenapi.z.string().optional(),
13412
+ sourceOfIncome: zodOpenapi.z.string(),
13413
+ transactionType: zodOpenapi.z.string().optional(),
13414
+ transactionTypeExpiry: zodOpenapi.z.date().optional(),
13415
+ isDistraint: zodOpenapi.z.boolean().default(false),
13416
+ estTxsVolumeMonth: zodOpenapi.z.string(),
13417
+ estTxsVolumeYear: zodOpenapi.z.string(),
13418
+ tradingCountries: zodOpenapi.z.string(),
13419
+ tradingSide: zodOpenapi.z.string(),
13420
+ acceptedAMLTermsAndConditions: zodOpenapi.z.boolean(),
13421
+ signatureMethod: zodOpenapi.z.string().optional(),
13422
+ existencePeriod: zodOpenapi.z.string().optional(),
13423
+ reputation: zodOpenapi.z.string().optional(),
13424
+ riskLevel: zodOpenapi.z.enum(AmlScoreTypeZod).optional(),
13425
+ kycStatus: zodOpenapi.z.enum(KycStatusZod).optional()
13426
+ });
13427
+ const createPartyInputSchema = zodOpenapi.z.object({
13428
+ party: partySchema$1.omit({ id: true }),
13429
+ personalData: individualInsertSchema.nullable(),
13430
+ organizationData: createOrganizationInputSchema.nullable(),
13431
+ bankAccounts: zodOpenapi.z.array(bankAccountInputSchema),
13432
+ disponents: zodOpenapi.z.array(disponentSchema),
13433
+ addresses: zodOpenapi.z.array(createAddressInputSchema),
13434
+ aml: createAmlInputSchema,
13435
+ recipients: zodOpenapi.z.array(bankAccountInputSchema)
13436
+ });
13437
+ const partyCreateOutputSchema = zodOpenapi.z.object({
13438
+ customerStatus: zodOpenapi.z.enum(CustomerStatusZod),
13439
+ partyType: zodOpenapi.z.enum(PartyTypeZod),
13440
+ language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
13441
+ id: zodOpenapi.z.uuid(),
13442
+ internalId: zodOpenapi.z.string().nullable(),
13443
+ note: zodOpenapi.z.string().nullable(),
13444
+ countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).nullable(),
13445
+ createdAt: zodOpenapi.z.date().nullable(),
13446
+ updatedAt: zodOpenapi.z.date().nullable()
13447
+ });
13448
+ const responseBodySchema$5 = zodOpenapi.z.object({
13449
+ message: zodOpenapi.z.string(),
13450
+ party: partyCreateOutputSchema
13451
+ });
13452
+ const createPartyRoute = zodOpenapi.createRoute({
13453
+ method: "post",
13454
+ path: "/",
13455
+ summary: "Create party",
13456
+ tags: ["Parties"],
13457
+ request: {
13458
+ body: {
13459
+ content: {
13460
+ "application/json": {
13461
+ schema: createPartyInputSchema
13462
+ }
13463
+ },
13464
+ required: true
13465
+ }
13466
+ },
13467
+ responses: {
13468
+ 200: {
13469
+ content: {
13470
+ "application/json": {
13471
+ schema: responseBodySchema$5
13472
+ }
13473
+ },
13474
+ description: "Creates a Party."
13475
+ },
13476
+ ...errorResponse("Party", "Creation")
13477
+ }
13478
+ });
13479
+ new zodOpenapi.OpenAPIHono().openapi(
13480
+ createPartyRoute,
13481
+ async (context) => {
13482
+ const party = context.req.valid("json");
13483
+ const { data: partyData, error } = await context.env.MASTER_DATA_MANAGEMENT_SERVICE.createParty(party);
13484
+ if (!partyData || error) {
13485
+ return context.json(
13486
+ {
13487
+ message: "Could not create a party"
13488
+ },
13489
+ 500
13490
+ );
13491
+ }
13492
+ return context.json(
13493
+ {
13494
+ message: "party created",
13495
+ party: partyData
13496
+ },
13497
+ 200
13498
+ );
13499
+ }
13500
+ );
13501
+
13502
+ const partySchema = zodOpenapi.z.object({
13503
+ partyType: zodOpenapi.z.enum(PartyTypeZod),
13504
+ language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
13505
+ id: zodOpenapi.z.uuid(),
13506
+ internalId: zodOpenapi.z.string().optional(),
13507
+ note: zodOpenapi.z.string().optional(),
13508
+ countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional()
13509
+ });
13300
13510
  const individualUpdateSchema = zodOpenapi.z.object({
13301
13511
  id: zodOpenapi.z.uuid(),
13302
13512
  partyId: zodOpenapi.z.uuid(),
@@ -13326,6 +13536,187 @@ const individualUpdateSchema = zodOpenapi.z.object({
13326
13536
  stayAbroad: zodOpenapi.z.boolean().optional(),
13327
13537
  stayAbroadCountries: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional()
13328
13538
  });
13539
+ const organizationUpdateSchema = zodOpenapi.z.object({
13540
+ id: zodOpenapi.z.uuid(),
13541
+ partyId: zodOpenapi.z.uuid().optional(),
13542
+ internalId: zodOpenapi.z.string().optional(),
13543
+ businessName: zodOpenapi.z.string().optional(),
13544
+ email: zodOpenapi.z.email("Invalid email format").optional(),
13545
+ phone: zodOpenapi.z.string().optional(),
13546
+ registeredNumber: zodOpenapi.z.string().optional(),
13547
+ registeredIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional(),
13548
+ operatesIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional(),
13549
+ presentIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional(),
13550
+ monthlyVolumeIn: zodOpenapi.z.number().optional(),
13551
+ monthlyVolumeOut: zodOpenapi.z.number().optional(),
13552
+ ownedBy: zodOpenapi.z.string().optional(),
13553
+ companyObjects: zodOpenapi.z.string().optional(),
13554
+ annualTurnover: zodOpenapi.z.number().optional(),
13555
+ numberOfEmployees: zodOpenapi.z.number().optional(),
13556
+ prosecuted: zodOpenapi.z.string().optional(),
13557
+ location: zodOpenapi.z.string().optional(),
13558
+ fileNumber: zodOpenapi.z.string().optional(),
13559
+ websiteUrl: zodOpenapi.z.url("Invalid website URL").optional(),
13560
+ vatPayer: zodOpenapi.z.boolean().optional(),
13561
+ companyObjectsDescription: zodOpenapi.z.string(),
13562
+ turnover3years: zodOpenapi.z.number(),
13563
+ operationCountries: zodOpenapi.z.string(),
13564
+ riskyBusinessType: zodOpenapi.z.string().optional()
13565
+ });
13566
+ const updateBankAccountSchema = zodOpenapi.z.object({
13567
+ ...bankAccountMetadataSchema.shape,
13568
+ partyId: zodOpenapi.z.uuid(),
13569
+ internalId: zodOpenapi.z.string().optional(),
13570
+ holderName: zodOpenapi.z.string(),
13571
+ number: zodOpenapi.z.string().optional(),
13572
+ currency: bankAccountMetadataSchema.shape.currency.nonoptional(),
13573
+ countryCode: bankAccountMetadataSchema.shape.countryCode.nonoptional(),
13574
+ id: bankAccountMetadataSchema.shape.id.nonoptional()
13575
+ });
13576
+ const disponentUpdateSchema = zodOpenapi.z.discriminatedUnion("partyType", [
13577
+ zodOpenapi.z.object({
13578
+ partyType: zodOpenapi.z.literal("INDIVIDUAL"),
13579
+ data: individualUpdateSchema
13580
+ }),
13581
+ zodOpenapi.z.object({
13582
+ partyType: zodOpenapi.z.literal("ORGANIZATION"),
13583
+ data: organizationUpdateSchema
13584
+ })
13585
+ ]);
13586
+ const updateAddressInputSchema = zodOpenapi.z.object({
13587
+ id: zodOpenapi.z.uuid(),
13588
+ partyId: zodOpenapi.z.uuid(),
13589
+ internalId: zodOpenapi.z.string().optional(),
13590
+ addressType: zodOpenapi.z.enum(AddressTypeZod),
13591
+ street: zodOpenapi.z.string(),
13592
+ orientationNumber: zodOpenapi.z.string().optional(),
13593
+ descriptiveNumber: zodOpenapi.z.string().optional(),
13594
+ municipality: zodOpenapi.z.string().max(255),
13595
+ municipalityPart: zodOpenapi.z.string().optional(),
13596
+ zipCode: zodOpenapi.z.string().max(20),
13597
+ district: zodOpenapi.z.string().max(255),
13598
+ region: zodOpenapi.z.string().max(255),
13599
+ countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13600
+ ruianCode: zodOpenapi.z.string().optional()
13601
+ });
13602
+ const updateAmlInputSchema = zodOpenapi.z.object({
13603
+ id: zodOpenapi.z.uuid(),
13604
+ partyId: zodOpenapi.z.uuid().optional(),
13605
+ internalId: zodOpenapi.z.string().optional(),
13606
+ sourceOfWealth: zodOpenapi.z.string().optional(),
13607
+ yearlyIncome: zodOpenapi.z.string().optional(),
13608
+ tradesPurpose: zodOpenapi.z.string().optional(),
13609
+ sourceOfIncome: zodOpenapi.z.string().optional(),
13610
+ transactionType: zodOpenapi.z.string().optional(),
13611
+ transactionTypeExpiry: zodOpenapi.z.date().optional(),
13612
+ isDistraint: zodOpenapi.z.boolean().optional(),
13613
+ estTxsVolumeMonth: zodOpenapi.z.string(),
13614
+ estTxsVolumeYear: zodOpenapi.z.string(),
13615
+ tradingCountries: zodOpenapi.z.string(),
13616
+ tradingSide: zodOpenapi.z.string(),
13617
+ acceptedAMLTermsAndConditions: zodOpenapi.z.boolean(),
13618
+ signatureMethod: zodOpenapi.z.string().optional(),
13619
+ existencePeriod: zodOpenapi.z.string().optional(),
13620
+ reputation: zodOpenapi.z.string().optional(),
13621
+ riskLevel: zodOpenapi.z.enum(AmlScoreTypeZod).optional(),
13622
+ kycStatus: zodOpenapi.z.enum(KycStatusZod).optional()
13623
+ });
13624
+ const partyUpdateInputSchema = zodOpenapi.z.object({
13625
+ party: partySchema,
13626
+ personalData: individualUpdateSchema.nullable(),
13627
+ organizationData: organizationUpdateSchema.nullable(),
13628
+ bankAccounts: zodOpenapi.z.array(updateBankAccountSchema),
13629
+ disponents: zodOpenapi.z.array(disponentUpdateSchema).optional(),
13630
+ addresses: zodOpenapi.z.array(updateAddressInputSchema),
13631
+ recipients: zodOpenapi.z.array(updateBankAccountSchema).nullable(),
13632
+ aml: updateAmlInputSchema.optional()
13633
+ });
13634
+ const updatePartyOuputSchema = zodOpenapi.z.object({
13635
+ id: zodOpenapi.z.uuid(),
13636
+ customerStatus: zodOpenapi.z.enum(CustomerStatusZod),
13637
+ partyType: zodOpenapi.z.enum(PartyTypeZod),
13638
+ language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
13639
+ note: zodOpenapi.z.string().nullable(),
13640
+ countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).nullable()
13641
+ });
13642
+ const responseBodySchema$4 = zodOpenapi.z.object({
13643
+ message: zodOpenapi.z.string(),
13644
+ party: updatePartyOuputSchema
13645
+ });
13646
+ const updatePartyRoute = zodOpenapi.createRoute({
13647
+ method: "put",
13648
+ path: "/{partyId}",
13649
+ summary: "Update party",
13650
+ tags: ["Parties"],
13651
+ security: [
13652
+ {
13653
+ JwtAuth: []
13654
+ }
13655
+ ],
13656
+ request: {
13657
+ params: zodOpenapi.z.object({ partyId: zodOpenapi.z.uuid() }),
13658
+ body: {
13659
+ content: {
13660
+ "application/json": {
13661
+ schema: partyUpdateInputSchema
13662
+ }
13663
+ },
13664
+ required: true
13665
+ }
13666
+ },
13667
+ responses: {
13668
+ 200: {
13669
+ content: {
13670
+ "application/json": {
13671
+ schema: responseBodySchema$4
13672
+ }
13673
+ },
13674
+ description: "Updates a Party."
13675
+ },
13676
+ ...errorResponse("Party", "Update")
13677
+ }
13678
+ });
13679
+ new zodOpenapi.OpenAPIHono().openapi(
13680
+ updatePartyRoute,
13681
+ async (context) => {
13682
+ const party = context.req.valid("json");
13683
+ const { partyId } = context.req.valid("param");
13684
+ const { data: updatedParty, error: partyError } = await context.env.MASTER_DATA_MANAGEMENT_SERVICE.updateParty({
13685
+ partyId,
13686
+ party: party.party,
13687
+ personalData: party.personalData ?? void 0,
13688
+ organizationData: party.organizationData ?? void 0,
13689
+ bankAccounts: party.bankAccounts ?? void 0,
13690
+ disponents: party.disponents ?? void 0,
13691
+ addresses: party.addresses ?? void 0,
13692
+ recipients: party.recipients ?? void 0,
13693
+ aml: party.aml ?? void 0
13694
+ });
13695
+ if (!updatedParty || partyError) {
13696
+ return context.json({ message: "Could not update a Party" }, 404);
13697
+ }
13698
+ return context.json(
13699
+ {
13700
+ message: "Party updated successfully",
13701
+ party: updatedParty
13702
+ },
13703
+ 200
13704
+ );
13705
+ }
13706
+ );
13707
+
13708
+ const partyBaseOutputSchema = zodOpenapi.z.object({
13709
+ customerStatus: zodOpenapi.z.enum(CustomerStatusZod),
13710
+ partyType: zodOpenapi.z.enum(PartyTypeZod),
13711
+ language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
13712
+ id: zodOpenapi.z.uuid(),
13713
+ internalId: zodOpenapi.z.string().nullable(),
13714
+ note: zodOpenapi.z.string().nullable(),
13715
+ countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).nullable(),
13716
+ createdAt: zodOpenapi.z.date().nullable(),
13717
+ updatedAt: zodOpenapi.z.date().nullable(),
13718
+ isClient: zodOpenapi.z.boolean()
13719
+ });
13329
13720
  const individualOutputSchema = zodOpenapi.z.object({
13330
13721
  id: zodOpenapi.z.uuid(),
13331
13722
  partyId: zodOpenapi.z.uuid(),
@@ -13357,116 +13748,7 @@ const individualOutputSchema = zodOpenapi.z.object({
13357
13748
  createdAt: zodOpenapi.z.coerce.date().nullable(),
13358
13749
  updatedAt: zodOpenapi.z.coerce.date().nullable()
13359
13750
  });
13360
-
13361
- zodOpenapi.z.object({
13362
- partyId: zodOpenapi.z.uuid(),
13363
- internalId: zodOpenapi.z.string().optional(),
13364
- businessName: zodOpenapi.z.string(),
13365
- email: zodOpenapi.z.email("Invalid email format").optional(),
13366
- phone: zodOpenapi.z.string().optional(),
13367
- registeredNumber: zodOpenapi.z.string(),
13368
- registeredIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13369
- operatesIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13370
- presentIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13371
- monthlyVolumeIn: zodOpenapi.z.number(),
13372
- monthlyVolumeOut: zodOpenapi.z.number(),
13373
- ownedBy: zodOpenapi.z.string(),
13374
- companyObjects: zodOpenapi.z.string(),
13375
- annualTurnover: zodOpenapi.z.number(),
13376
- numberOfEmployees: zodOpenapi.z.number().optional(),
13377
- prosecuted: zodOpenapi.z.string().optional(),
13378
- location: zodOpenapi.z.string().optional(),
13379
- fileNumber: zodOpenapi.z.string().optional(),
13380
- websiteUrl: zodOpenapi.z.url("Invalid website URL").optional(),
13381
- vatPayer: zodOpenapi.z.boolean(),
13382
- companyObjectsDescription: zodOpenapi.z.string(),
13383
- turnover3years: zodOpenapi.z.number(),
13384
- operationCountries: zodOpenapi.z.string(),
13385
- riskyBusinessType: zodOpenapi.z.string().optional()
13386
- });
13387
- const organizationUpdateSchema = zodOpenapi.z.object({
13388
- id: zodOpenapi.z.uuid(),
13389
- partyId: zodOpenapi.z.uuid().optional(),
13390
- internalId: zodOpenapi.z.string().optional(),
13391
- businessName: zodOpenapi.z.string().optional(),
13392
- email: zodOpenapi.z.email("Invalid email format").optional(),
13393
- phone: zodOpenapi.z.string().optional(),
13394
- registeredNumber: zodOpenapi.z.string().optional(),
13395
- registeredIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional(),
13396
- operatesIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional(),
13397
- presentIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional(),
13398
- monthlyVolumeIn: zodOpenapi.z.number().optional(),
13399
- monthlyVolumeOut: zodOpenapi.z.number().optional(),
13400
- ownedBy: zodOpenapi.z.string().optional(),
13401
- companyObjects: zodOpenapi.z.string().optional(),
13402
- annualTurnover: zodOpenapi.z.number().optional(),
13403
- numberOfEmployees: zodOpenapi.z.number().optional(),
13404
- prosecuted: zodOpenapi.z.string().optional(),
13405
- location: zodOpenapi.z.string().optional(),
13406
- fileNumber: zodOpenapi.z.string().optional(),
13407
- websiteUrl: zodOpenapi.z.url("Invalid website URL").optional(),
13408
- vatPayer: zodOpenapi.z.boolean().optional(),
13409
- companyObjectsDescription: zodOpenapi.z.string(),
13410
- turnover3years: zodOpenapi.z.number(),
13411
- operationCountries: zodOpenapi.z.string(),
13412
- riskyBusinessType: zodOpenapi.z.string().optional()
13413
- });
13414
- zodOpenapi.z.object({
13415
- id: zodOpenapi.z.uuid(),
13416
- partyId: zodOpenapi.z.uuid(),
13417
- internalId: zodOpenapi.z.string().nullable(),
13418
- businessName: zodOpenapi.z.string(),
13419
- email: zodOpenapi.z.string().nullable(),
13420
- phone: zodOpenapi.z.string().nullable(),
13421
- registeredNumber: zodOpenapi.z.string(),
13422
- registeredIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13423
- operatesIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13424
- presentIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13425
- monthlyVolumeIn: zodOpenapi.z.number(),
13426
- monthlyVolumeOut: zodOpenapi.z.number(),
13427
- ownedBy: zodOpenapi.z.string(),
13428
- companyObjects: zodOpenapi.z.string(),
13429
- annualTurnover: zodOpenapi.z.number(),
13430
- numberOfEmployees: zodOpenapi.z.number().nullable(),
13431
- prosecuted: zodOpenapi.z.string().nullable(),
13432
- location: zodOpenapi.z.string().nullable(),
13433
- fileNumber: zodOpenapi.z.string().nullable(),
13434
- websiteUrl: zodOpenapi.z.string().nullable(),
13435
- vatPayer: zodOpenapi.z.boolean(),
13436
- companyObjectsDescription: zodOpenapi.z.string(),
13437
- turnover3years: zodOpenapi.z.number(),
13438
- operationCountries: zodOpenapi.z.string(),
13439
- riskyBusinessType: zodOpenapi.z.string().nullable(),
13440
- createdAt: zodOpenapi.z.coerce.date().nullable(),
13441
- updatedAt: zodOpenapi.z.coerce.date().nullable()
13442
- });
13443
- const createOrganizationInputSchema = zodOpenapi.z.object({
13444
- partyId: zodOpenapi.z.uuid(),
13445
- internalId: zodOpenapi.z.string().optional(),
13446
- businessName: zodOpenapi.z.string(),
13447
- email: zodOpenapi.z.string().optional(),
13448
- phone: zodOpenapi.z.string().optional(),
13449
- registeredNumber: zodOpenapi.z.string(),
13450
- registeredIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13451
- operatesIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13452
- presentIn: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13453
- monthlyVolumeIn: zodOpenapi.z.number(),
13454
- monthlyVolumeOut: zodOpenapi.z.number(),
13455
- ownedBy: zodOpenapi.z.string(),
13456
- companyObjects: zodOpenapi.z.string(),
13457
- annualTurnover: zodOpenapi.z.number(),
13458
- numberOfEmployees: zodOpenapi.z.number(),
13459
- prosecuted: zodOpenapi.z.string().optional(),
13460
- location: zodOpenapi.z.string().optional(),
13461
- fileNumber: zodOpenapi.z.string().optional(),
13462
- websiteUrl: zodOpenapi.z.string().optional(),
13463
- vatPayer: zodOpenapi.z.boolean(),
13464
- companyObjectsDescription: zodOpenapi.z.string(),
13465
- turnover3years: zodOpenapi.z.number(),
13466
- operationCountries: zodOpenapi.z.string(),
13467
- riskyBusinessType: zodOpenapi.z.string().optional()
13468
- });
13469
- const createOrganizationOutputSchema = zodOpenapi.z.object({
13751
+ const createOrganizationOutputSchema = zodOpenapi.z.object({
13470
13752
  partyId: zodOpenapi.z.uuid(),
13471
13753
  internalId: zodOpenapi.z.string().nullable(),
13472
13754
  businessName: zodOpenapi.z.string(),
@@ -13492,53 +13774,6 @@ const createOrganizationOutputSchema = zodOpenapi.z.object({
13492
13774
  operationCountries: zodOpenapi.z.string(),
13493
13775
  riskyBusinessType: zodOpenapi.z.string().nullable()
13494
13776
  });
13495
-
13496
- const disponentSchema = zodOpenapi.z.discriminatedUnion("partyType", [
13497
- zodOpenapi.z.object({
13498
- partyType: zodOpenapi.z.literal("INDIVIDUAL"),
13499
- data: individualInsertSchema.omit({ partyId: true })
13500
- }),
13501
- zodOpenapi.z.object({
13502
- partyType: zodOpenapi.z.literal("ORGANIZATION"),
13503
- data: createOrganizationInputSchema.omit({ partyId: true })
13504
- })
13505
- ]);
13506
- const disponentUpdateSchema = zodOpenapi.z.discriminatedUnion("partyType", [
13507
- zodOpenapi.z.object({
13508
- partyType: zodOpenapi.z.literal("INDIVIDUAL"),
13509
- data: individualUpdateSchema
13510
- }),
13511
- zodOpenapi.z.object({
13512
- partyType: zodOpenapi.z.literal("ORGANIZATION"),
13513
- data: organizationUpdateSchema
13514
- })
13515
- ]);
13516
- const disponentOutputSchema = zodOpenapi.z.discriminatedUnion("partyType", [
13517
- zodOpenapi.z.object({
13518
- partyType: zodOpenapi.z.literal("INDIVIDUAL"),
13519
- data: individualOutputSchema.nullable()
13520
- }),
13521
- zodOpenapi.z.object({
13522
- partyType: zodOpenapi.z.literal("ORGANIZATION"),
13523
- data: createOrganizationOutputSchema.nullable()
13524
- })
13525
- ]);
13526
-
13527
- const updateBankAccountSchema = zodOpenapi.z.object({
13528
- ...bankAccountMetadataSchema.shape,
13529
- partyId: zodOpenapi.z.uuid(),
13530
- internalId: zodOpenapi.z.string().optional(),
13531
- holderName: zodOpenapi.z.string(),
13532
- number: zodOpenapi.z.string().optional(),
13533
- currency: bankAccountMetadataSchema.shape.currency.nonoptional(),
13534
- countryCode: bankAccountMetadataSchema.shape.countryCode.nonoptional(),
13535
- id: bankAccountMetadataSchema.shape.id.nonoptional()
13536
- });
13537
- const bankAccountInputSchema = updateBankAccountSchema.required({
13538
- holderName: true,
13539
- currency: true,
13540
- countryCode: true
13541
- }).omit({ id: true, partyId: true });
13542
13777
  const bankAccountOutputSchema = zodOpenapi.z.object({
13543
13778
  id: zodOpenapi.z.string(),
13544
13779
  partyId: zodOpenapi.z.uuid(),
@@ -13559,90 +13794,16 @@ const bankAccountOutputSchema = zodOpenapi.z.object({
13559
13794
  brBankNumber: zodOpenapi.z.string().nullable(),
13560
13795
  updatedAt: zodOpenapi.z.coerce.date().nullable()
13561
13796
  });
13562
-
13563
- const createAmlInputSchema = zodOpenapi.z.object({
13564
- partyId: zodOpenapi.z.uuid(),
13565
- internalId: zodOpenapi.z.string().optional(),
13566
- sourceOfWealth: zodOpenapi.z.string(),
13567
- yearlyIncome: zodOpenapi.z.string(),
13568
- tradesPurpose: zodOpenapi.z.string().optional(),
13569
- sourceOfIncome: zodOpenapi.z.string(),
13570
- transactionType: zodOpenapi.z.string().optional(),
13571
- transactionTypeExpiry: zodOpenapi.z.date().optional(),
13572
- isDistraint: zodOpenapi.z.boolean().default(false),
13573
- estTxsVolumeMonth: zodOpenapi.z.string(),
13574
- estTxsVolumeYear: zodOpenapi.z.string(),
13575
- tradingCountries: zodOpenapi.z.string(),
13576
- tradingSide: zodOpenapi.z.string(),
13577
- acceptedAMLTermsAndConditions: zodOpenapi.z.boolean(),
13578
- signatureMethod: zodOpenapi.z.string().optional(),
13579
- existencePeriod: zodOpenapi.z.string().optional(),
13580
- reputation: zodOpenapi.z.string().optional(),
13581
- riskLevel: zodOpenapi.z.enum(AmlScoreTypeZod$1).optional(),
13582
- kycStatus: zodOpenapi.z.enum(KycStatusZod$1).optional()
13583
- });
13584
- const updateAmlInputSchema = zodOpenapi.z.object({
13585
- id: zodOpenapi.z.uuid(),
13586
- partyId: zodOpenapi.z.uuid().optional(),
13587
- internalId: zodOpenapi.z.string().optional(),
13588
- sourceOfWealth: zodOpenapi.z.string().optional(),
13589
- yearlyIncome: zodOpenapi.z.string().optional(),
13590
- tradesPurpose: zodOpenapi.z.string().optional(),
13591
- sourceOfIncome: zodOpenapi.z.string().optional(),
13592
- transactionType: zodOpenapi.z.string().optional(),
13593
- transactionTypeExpiry: zodOpenapi.z.date().optional(),
13594
- isDistraint: zodOpenapi.z.boolean().optional(),
13595
- estTxsVolumeMonth: zodOpenapi.z.string(),
13596
- estTxsVolumeYear: zodOpenapi.z.string(),
13597
- tradingCountries: zodOpenapi.z.string(),
13598
- tradingSide: zodOpenapi.z.string(),
13599
- acceptedAMLTermsAndConditions: zodOpenapi.z.boolean(),
13600
- signatureMethod: zodOpenapi.z.string().optional(),
13601
- existencePeriod: zodOpenapi.z.string().optional(),
13602
- reputation: zodOpenapi.z.string().optional(),
13603
- riskLevel: zodOpenapi.z.enum(AmlScoreTypeZod$1).optional(),
13604
- kycStatus: zodOpenapi.z.enum(KycStatusZod$1).optional()
13605
- });
13606
- const createAmlOutputSchema = zodOpenapi.z.object({
13607
- id: zodOpenapi.z.uuid(),
13608
- partyId: zodOpenapi.z.uuid(),
13609
- internalId: zodOpenapi.z.string().nullable(),
13610
- sourceOfWealth: zodOpenapi.z.string(),
13611
- yearlyIncome: zodOpenapi.z.string(),
13612
- tradesPurpose: zodOpenapi.z.string().nullable(),
13613
- sourceOfIncome: zodOpenapi.z.string(),
13614
- transactionType: zodOpenapi.z.string().nullable(),
13615
- transactionTypeExpiry: zodOpenapi.z.date().nullable(),
13616
- isDistraint: zodOpenapi.z.boolean(),
13617
- estTxsVolumeMonth: zodOpenapi.z.string(),
13618
- estTxsVolumeYear: zodOpenapi.z.string(),
13619
- tradingCountries: zodOpenapi.z.string(),
13620
- tradingSide: zodOpenapi.z.string(),
13621
- acceptedAMLTermsAndConditions: zodOpenapi.z.boolean(),
13622
- signatureMethod: zodOpenapi.z.string().nullable(),
13623
- existencePeriod: zodOpenapi.z.string().nullable(),
13624
- reputation: zodOpenapi.z.string().nullable(),
13625
- riskLevel: zodOpenapi.z.enum(AmlScoreTypeZod$1),
13626
- kycStatus: zodOpenapi.z.enum(KycStatusZod$1).nullable(),
13627
- createdAt: zodOpenapi.z.date().nullable(),
13628
- updatedAt: zodOpenapi.z.date().nullable()
13629
- });
13630
-
13631
- const createAddressInputSchema = zodOpenapi.z.object({
13632
- partyId: zodOpenapi.z.uuid(),
13633
- addressType: zodOpenapi.z.enum(AddressTypeZod),
13634
- internalId: zodOpenapi.z.string().optional(),
13635
- street: zodOpenapi.z.string(),
13636
- orientationNumber: zodOpenapi.z.string().optional(),
13637
- descriptiveNumber: zodOpenapi.z.string().optional(),
13638
- municipality: zodOpenapi.z.string().max(255),
13639
- municipalityPart: zodOpenapi.z.string().optional(),
13640
- zipCode: zodOpenapi.z.string().max(20),
13641
- district: zodOpenapi.z.string().max(255),
13642
- region: zodOpenapi.z.string().max(255),
13643
- countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13644
- ruianCode: zodOpenapi.z.string().optional()
13645
- });
13797
+ const disponentOutputSchema = zodOpenapi.z.discriminatedUnion("partyType", [
13798
+ zodOpenapi.z.object({
13799
+ partyType: zodOpenapi.z.literal("INDIVIDUAL"),
13800
+ data: individualOutputSchema.nullable()
13801
+ }),
13802
+ zodOpenapi.z.object({
13803
+ partyType: zodOpenapi.z.literal("ORGANIZATION"),
13804
+ data: createOrganizationOutputSchema.nullable()
13805
+ })
13806
+ ]);
13646
13807
  const createAddressOutputSchema = zodOpenapi.z.object({
13647
13808
  id: zodOpenapi.z.uuid(),
13648
13809
  partyId: zodOpenapi.z.uuid(),
@@ -13661,68 +13822,32 @@ const createAddressOutputSchema = zodOpenapi.z.object({
13661
13822
  createdAt: zodOpenapi.z.date().nullable(),
13662
13823
  updatedAt: zodOpenapi.z.date().nullable()
13663
13824
  });
13664
- const updateAddressInputSchema = zodOpenapi.z.object({
13825
+ const createAmlOutputSchema = zodOpenapi.z.object({
13665
13826
  id: zodOpenapi.z.uuid(),
13666
13827
  partyId: zodOpenapi.z.uuid(),
13667
- internalId: zodOpenapi.z.string().optional(),
13668
- addressType: zodOpenapi.z.enum(AddressTypeZod),
13669
- street: zodOpenapi.z.string(),
13670
- orientationNumber: zodOpenapi.z.string().optional(),
13671
- descriptiveNumber: zodOpenapi.z.string().optional(),
13672
- municipality: zodOpenapi.z.string().max(255),
13673
- municipalityPart: zodOpenapi.z.string().optional(),
13674
- zipCode: zodOpenapi.z.string().max(20),
13675
- district: zodOpenapi.z.string().max(255),
13676
- region: zodOpenapi.z.string().max(255),
13677
- countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2),
13678
- ruianCode: zodOpenapi.z.string().optional()
13679
- });
13680
-
13681
- const partySchema = zodOpenapi.z.object({
13682
- partyType: zodOpenapi.z.enum(PartyTypeZod),
13683
- language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
13684
- id: zodOpenapi.z.uuid(),
13685
- internalId: zodOpenapi.z.string().optional(),
13686
- note: zodOpenapi.z.string().optional(),
13687
- countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional()
13688
- });
13689
- const partyCreateOutputSchema = zodOpenapi.z.object({
13690
- customerStatus: zodOpenapi.z.enum(CustomerStatusZod),
13691
- partyType: zodOpenapi.z.enum(PartyTypeZod),
13692
- language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
13693
- id: zodOpenapi.z.uuid(),
13694
- internalId: zodOpenapi.z.string().nullable(),
13695
- note: zodOpenapi.z.string().nullable(),
13696
- countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).nullable(),
13697
- createdAt: zodOpenapi.z.date().nullable(),
13698
- updatedAt: zodOpenapi.z.date().nullable()
13699
- });
13700
- zodOpenapi.z.object({
13701
- customerStatus: zodOpenapi.z.enum(CustomerStatusZod),
13702
- partyType: zodOpenapi.z.enum(PartyTypeZod),
13703
- language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
13704
- id: zodOpenapi.z.uuid(),
13705
13828
  internalId: zodOpenapi.z.string().nullable(),
13706
- note: zodOpenapi.z.string().nullable(),
13707
- countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).nullable(),
13829
+ sourceOfWealth: zodOpenapi.z.string(),
13830
+ yearlyIncome: zodOpenapi.z.string(),
13831
+ tradesPurpose: zodOpenapi.z.string().nullable(),
13832
+ sourceOfIncome: zodOpenapi.z.string(),
13833
+ transactionType: zodOpenapi.z.string().nullable(),
13834
+ transactionTypeExpiry: zodOpenapi.z.date().nullable(),
13835
+ isDistraint: zodOpenapi.z.boolean(),
13836
+ estTxsVolumeMonth: zodOpenapi.z.string(),
13837
+ estTxsVolumeYear: zodOpenapi.z.string(),
13838
+ tradingCountries: zodOpenapi.z.string(),
13839
+ tradingSide: zodOpenapi.z.string(),
13840
+ acceptedAMLTermsAndConditions: zodOpenapi.z.boolean(),
13841
+ signatureMethod: zodOpenapi.z.string().nullable(),
13842
+ existencePeriod: zodOpenapi.z.string().nullable(),
13843
+ reputation: zodOpenapi.z.string().nullable(),
13844
+ riskLevel: zodOpenapi.z.enum(AmlScoreTypeZod),
13845
+ kycStatus: zodOpenapi.z.enum(KycStatusZod).nullable(),
13708
13846
  createdAt: zodOpenapi.z.date().nullable(),
13709
13847
  updatedAt: zodOpenapi.z.date().nullable()
13710
13848
  });
13711
- const createPartyInputSchema = zodOpenapi.z.object({
13712
- party: partySchema.omit({ id: true }),
13713
- personalData: individualInsertSchema.omit({ partyId: true }).nullable(),
13714
- organizationData: createOrganizationInputSchema.omit({ partyId: true }).nullable(),
13715
- bankAccounts: zodOpenapi.z.array(bankAccountInputSchema),
13716
- disponents: zodOpenapi.z.array(disponentSchema),
13717
- addresses: zodOpenapi.z.array(createAddressInputSchema.omit({ partyId: true })),
13718
- aml: createAmlInputSchema.omit({ partyId: true }),
13719
- recipients: zodOpenapi.z.array(bankAccountInputSchema)
13720
- });
13721
13849
  const partyOutputSchema = zodOpenapi.z.object({
13722
- party: partyCreateOutputSchema.extend({
13723
- id: zodOpenapi.z.uuid(),
13724
- isClient: zodOpenapi.z.boolean()
13725
- }).nullable(),
13850
+ party: partyBaseOutputSchema.nullable(),
13726
13851
  personalData: individualOutputSchema.nullable(),
13727
13852
  organizationData: createOrganizationOutputSchema.nullable(),
13728
13853
  bankAccounts: zodOpenapi.z.array(bankAccountOutputSchema).nullable(),
@@ -13731,26 +13856,168 @@ const partyOutputSchema = zodOpenapi.z.object({
13731
13856
  aml: createAmlOutputSchema.nullable(),
13732
13857
  recipients: zodOpenapi.z.array(bankAccountOutputSchema).nullable()
13733
13858
  });
13734
- const partiesOutputDataSchema = zodOpenapi.z.array(partyOutputSchema);
13735
- const partyUpdateInputSchema = zodOpenapi.z.object({
13736
- party: partySchema,
13737
- personalData: individualUpdateSchema.nullable(),
13738
- organizationData: organizationUpdateSchema.nullable(),
13739
- bankAccounts: zodOpenapi.z.array(updateBankAccountSchema),
13740
- disponents: zodOpenapi.z.array(disponentUpdateSchema).optional(),
13741
- addresses: zodOpenapi.z.array(updateAddressInputSchema),
13742
- recipients: zodOpenapi.z.array(updateBankAccountSchema).nullable(),
13743
- aml: updateAmlInputSchema.optional()
13859
+ const responseBodySchema$3 = zodOpenapi.z.object({
13860
+ message: zodOpenapi.z.string(),
13861
+ party: partyOutputSchema
13862
+ });
13863
+ const getPartyByPartyIdRoute = zodOpenapi.createRoute({
13864
+ method: "get",
13865
+ path: "/{partyId}",
13866
+ summary: "Get party",
13867
+ tags: ["Parties"],
13868
+ request: {
13869
+ params: zodOpenapi.z.object({ partyId: zodOpenapi.z.uuid() })
13870
+ },
13871
+ responses: {
13872
+ 200: {
13873
+ content: {
13874
+ "application/json": {
13875
+ schema: responseBodySchema$3
13876
+ }
13877
+ },
13878
+ description: "Get party by party Id"
13879
+ },
13880
+ ...errorResponse("party", "Get")
13881
+ }
13744
13882
  });
13745
- const updatePartyOuputSchema = zodOpenapi.z.object({
13746
- id: zodOpenapi.z.uuid(),
13747
- customerStatus: zodOpenapi.z.enum(CustomerStatusZod),
13748
- partyType: zodOpenapi.z.enum(PartyTypeZod),
13749
- language: zodOpenapi.z.enum(generalCodes.LANGUAGE_CODES),
13750
- note: zodOpenapi.z.string().nullable(),
13751
- countryCode: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).nullable()
13883
+ new zodOpenapi.OpenAPIHono().openapi(
13884
+ getPartyByPartyIdRoute,
13885
+ async (context) => {
13886
+ const { partyId } = context.req.valid("param");
13887
+ const { data: partyData, error: partyError } = await context.env.MASTER_DATA_MANAGEMENT_SERVICE.getParty({ partyId });
13888
+ if (partyData == null || partyError) {
13889
+ return context.json({ message: "Party not found" }, 404);
13890
+ }
13891
+ return context.json(
13892
+ {
13893
+ message: "Party Found",
13894
+ party: partyData
13895
+ },
13896
+ 200
13897
+ );
13898
+ }
13899
+ );
13900
+
13901
+ const paginationSchema = zodOpenapi.z.object({
13902
+ offset: zodOpenapi.z.number().default(1),
13903
+ limit: zodOpenapi.z.number().default(10)
13752
13904
  });
13905
+ const paginationAndSearchSchema = zodOpenapi.z.object({
13906
+ page: zodOpenapi.z.coerce.number().positive().default(1),
13907
+ limit: zodOpenapi.z.coerce.number().positive().default(20),
13908
+ column: zodOpenapi.z.string(),
13909
+ direction: zodOpenapi.z.enum(["asc", "desc"]),
13910
+ search: zodOpenapi.z.string().optional(),
13911
+ ids: zodOpenapi.z.string().array().optional()
13912
+ });
13913
+ paginationSchema.extend({
13914
+ partyId: zodOpenapi.z.uuid()
13915
+ });
13916
+ paginationSchema.extend({
13917
+ id: zodOpenapi.z.uuid()
13918
+ });
13919
+ zodOpenapi.z.object({ partyId: zodOpenapi.z.uuid() });
13753
13920
 
13921
+ const partiesOutputDataSchema = zodOpenapi.z.array(partyOutputSchema);
13922
+ const getPartiesRoute = zodOpenapi.createRoute({
13923
+ method: "get",
13924
+ path: "/",
13925
+ summary: "List parties",
13926
+ tags: ["Parties"],
13927
+ request: { query: paginationAndSearchSchema },
13928
+ responses: {
13929
+ 500: {
13930
+ description: "Internal Server Error",
13931
+ content: {
13932
+ "application/json": {
13933
+ schema: routeError
13934
+ }
13935
+ }
13936
+ },
13937
+ 200: {
13938
+ content: {
13939
+ "application/json": {
13940
+ schema: zodOpenapi.z.object({
13941
+ message: zodOpenapi.z.string(),
13942
+ data: zodOpenapi.z.object({
13943
+ parties: partiesOutputDataSchema,
13944
+ totalCount: zodOpenapi.z.number()
13945
+ })
13946
+ })
13947
+ }
13948
+ },
13949
+ description: "Get Parties."
13950
+ }
13951
+ }
13952
+ });
13953
+ new zodOpenapi.OpenAPIHono().openapi(
13954
+ getPartiesRoute,
13955
+ async (context) => {
13956
+ const query = context.req.query();
13957
+ const validatedQuery = {
13958
+ page: query.page ? Number(query.page) : 1,
13959
+ limit: query.limit ? Number(query.limit) : 10,
13960
+ column: query.column || "createdAt",
13961
+ direction: query.direction || "desc",
13962
+ search: query.search,
13963
+ ids: query.ids ? Array.isArray(query.ids) ? query.ids : [query.ids] : void 0
13964
+ };
13965
+ const {
13966
+ data: parties,
13967
+ error,
13968
+ message,
13969
+ status
13970
+ } = await context.env.MASTER_DATA_MANAGEMENT_SERVICE.getParties(
13971
+ validatedQuery
13972
+ );
13973
+ if (error || !parties) {
13974
+ return context.json(
13975
+ {
13976
+ message: "Failed to get parties",
13977
+ data: null,
13978
+ errorDetail: {
13979
+ message,
13980
+ code: status
13981
+ },
13982
+ error: true
13983
+ },
13984
+ 500
13985
+ );
13986
+ }
13987
+ return context.json({ message, data: parties }, 200);
13988
+ }
13989
+ );
13990
+
13991
+ const DOCUMENT_SIDE = ["front", "back"];
13992
+ const paramsSchema$2 = zodOpenapi.z.object({
13993
+ partyId: zodOpenapi.z.uuid()
13994
+ });
13995
+ const idDocumentCreateInputSchema = zodOpenapi.z.object({
13996
+ partyId: zodOpenapi.z.uuid(),
13997
+ idDocType: zodOpenapi.z.enum(IdDocTypeZod),
13998
+ idDocNumber: zodOpenapi.z.string(),
13999
+ idDocHolderName: zodOpenapi.z.string(),
14000
+ issueDate: zodOpenapi.z.coerce.date().optional(),
14001
+ expirationDate: zodOpenapi.z.coerce.date().optional(),
14002
+ issuer: zodOpenapi.z.string().optional(),
14003
+ countryOfIssue: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional(),
14004
+ idDocStatus: zodOpenapi.z.enum(IdDocStatusZod).optional()
14005
+ });
14006
+ const idDocumentMultipartSchema = zodOpenapi.z.object({
14007
+ idDocument: zodOpenapi.z.string(),
14008
+ documentSide: zodOpenapi.z.enum(DOCUMENT_SIDE),
14009
+ file: zodOpenapi.z.any()
14010
+ });
14011
+ const multipartOpenApiSchema = zodOpenapi.z.object({
14012
+ idDocument: zodOpenapi.z.string().openapi({
14013
+ description: "JSON stringified IdDocument payload"
14014
+ }),
14015
+ documentSide: zodOpenapi.z.enum(DOCUMENT_SIDE),
14016
+ file: zodOpenapi.z.any().openapi({
14017
+ type: "string",
14018
+ format: "binary"
14019
+ })
14020
+ });
13754
14021
  const idDocumentOutputSchema = zodOpenapi.z.object({
13755
14022
  id: zodOpenapi.z.uuid(),
13756
14023
  createdAt: zodOpenapi.z.iso.datetime().nullable(),
@@ -13768,21 +14035,422 @@ const idDocumentOutputSchema = zodOpenapi.z.object({
13768
14035
  backImageUri: zodOpenapi.z.string().nullable(),
13769
14036
  idDocStatus: zodOpenapi.z.enum(IdDocStatusZod).nullable()
13770
14037
  });
14038
+ const responseBodySchema$2 = zodOpenapi.z.object({
14039
+ message: zodOpenapi.z.string(),
14040
+ idDocument: idDocumentOutputSchema
14041
+ });
14042
+ const createDocumentRoute = zodOpenapi.createRoute({
14043
+ method: "post",
14044
+ path: "/{partyId}/id-documents",
14045
+ summary: "Create ID document and upload file",
14046
+ tags: ["Documents"],
14047
+ // middleware: [jwt, signature(), idempotency()],
14048
+ // security: [{ JwtAuth: [] }],
14049
+ request: {
14050
+ // headers: z.object({
14051
+ // 'X-Idempotency-Key': XIdempotencyKeyHeaderSchema,
14052
+ // 'X-Signature': XSignatureHeaderSchema,
14053
+ // 'X-Signature-Key': XSignatureKeyHeaderSchema,
14054
+ // }),
14055
+ body: {
14056
+ content: {
14057
+ "multipart/form-data": {
14058
+ schema: multipartOpenApiSchema
14059
+ }
14060
+ },
14061
+ required: true
14062
+ },
14063
+ params: paramsSchema$2
14064
+ },
14065
+ responses: {
14066
+ 200: {
14067
+ description: "Document created and file uploaded",
14068
+ content: {
14069
+ "application/json": {
14070
+ schema: responseBodySchema$2
14071
+ }
14072
+ }
14073
+ },
14074
+ 400: {
14075
+ description: "Invalid request",
14076
+ content: {
14077
+ "application/json": {
14078
+ schema: zodOpenapi.z.object({ message: zodOpenapi.z.string() })
14079
+ }
14080
+ }
14081
+ },
14082
+ 500: {
14083
+ description: "Internal server error",
14084
+ content: {
14085
+ "application/json": {
14086
+ schema: zodOpenapi.z.object({ message: zodOpenapi.z.string() })
14087
+ }
14088
+ }
14089
+ }
14090
+ }
14091
+ });
14092
+ new zodOpenapi.OpenAPIHono().openapi(
14093
+ createDocumentRoute,
14094
+ async (context) => {
14095
+ const rawBody = await context.req.parseBody();
14096
+ const { partyId } = await context.req.param();
14097
+ const idDocumentRaw = rawBody.idDocument;
14098
+ const documentSide = rawBody.documentSide;
14099
+ const file = rawBody.file;
14100
+ if (typeof idDocumentRaw !== "string" || !DOCUMENT_SIDE.includes(documentSide) || !(file instanceof File)) {
14101
+ return context.json({ message: "Invalid multipart payload" }, 400);
14102
+ }
14103
+ const idDocumentJson = JSON.parse(JSON.parse(idDocumentRaw));
14104
+ const idDocumentResult = idDocumentCreateInputSchema.safeParse(idDocumentJson);
14105
+ if (!idDocumentResult.success) {
14106
+ console.error(idDocumentResult.error);
14107
+ return context.json({ message: "Could not parse IdDocument" }, 400);
14108
+ }
14109
+ const {
14110
+ data: createdIdDocument,
14111
+ error: createError,
14112
+ message
14113
+ } = await context.env.MASTER_DATA_MANAGEMENT_SERVICE.createIdDocument({
14114
+ idDocument: idDocumentResult.data,
14115
+ partyId
14116
+ });
14117
+ if (!createdIdDocument || createError) {
14118
+ console.error(message);
14119
+ return context.json({ message: "Could not create IdDocument" }, 500);
14120
+ }
14121
+ const bytes = new Uint8Array(await file.arrayBuffer());
14122
+ const { data: uploadResult, error: uploadError } = await context.env.DOCUMENT_SERVICE.uploadDocument({
14123
+ entityType: "client",
14124
+ entityId: createdIdDocument.id,
14125
+ type: "kyc",
14126
+ metadata: {},
14127
+ file: {
14128
+ bytes,
14129
+ type: file.type,
14130
+ name: file.name,
14131
+ size: file.size
14132
+ }
14133
+ });
14134
+ if (!uploadResult || uploadError) {
14135
+ return context.json({ message: "File upload failed" }, 500);
14136
+ }
14137
+ return context.json(
14138
+ {
14139
+ message: "IdDocument created successfully",
14140
+ idDocument: {
14141
+ ...createdIdDocument,
14142
+ frontImageUri: documentSide === "front" ? uploadResult.storageUrl : createdIdDocument.frontImageUri,
14143
+ backImageUri: documentSide === "back" ? uploadResult.storageUrl : createdIdDocument.backImageUri
14144
+ }
14145
+ },
14146
+ 200
14147
+ );
14148
+ }
14149
+ );
14150
+
14151
+ const XIdempotencyKeyHeaderSchema = zodOpenapi.z.string().openapi({
14152
+ description: "Unique identifier header to ensure the request is processed only once.",
14153
+ example: "4ac15c22-2bd3-426f-b915-bfd5febdb7df"
14154
+ });
14155
+ const XSignatureHeaderSchema = zodOpenapi.z.string().openapi({
14156
+ description: "Payload signature header to verify request body integrity.",
14157
+ example: "FIXAxHO6QqH3M7t4MatM8U6l/nIqWj7jIEW2U6/771MGUorSywy+GmKIG3B1mxT1jR7qPtBHQ5YSO8O53iCvOh6kIhbGXtVe/3C61dsEykLbmntV3nF4DY8/HyfF8a6c2Asc5bvgHrhosGi3s/ouoNowMpsckyq66We8H5gRbXlqJm4Bl1zWWQah4aQLX548L8DLx5+EIgArNMVVG8ryCES99aovJBKrQQMpQLwss1sSFuUZ1kdBCodtvxgTOXOugnZ1UNCmUNFXryQ6bn7wY7Punml/rwR/zTQ9j4SX07iFeQC5rgm9/zi29DBluegu+b8/G8oXrf6L4hugbMEKJfLRfKjNHCrjCooKtInoYxwNEfJyJ9mhqdBoeIBca9zgPpewdbwFLXVV82TYR+xZiywDcHKQ62IzQp07NOMCl4xArSJ3vIWUftSYpLIwomyjQEbY27oGiubUF4krEKgHnMYalCn0ruYOwFik2Pa6FEfIZo0TSXDC24UHQb5mJNPYpv2hny7U5CZPmBvjaRGMVnE+WgRUT19cwqlSL3pWAfeSn1Wro7lYBp/PmlRPgYIxl9GJwNlQ0G+NzP9cMSJbmI5fwErDNgJAaPaMwZbJ3y8ikmbBkkXNPKvQrWVGCJ4nP+/f8yYzMZq272EFx984pSoo2yAeBJnrxbW+AlZxyIo="
14158
+ });
14159
+ const XSignatureKeyHeaderSchema = zodOpenapi.z.string().openapi({
14160
+ description: "Signature key identifier header to specify which key was used for payload signing.",
14161
+ example: "ixtal"
14162
+ });
14163
+ const ALLOWED_ID_DOCUMENTS_FILTERS = {
14164
+ PARTY_ID: "filterIdDocumentPartyId",
14165
+ ISSUER: "filterIdDocumentIssuer"
14166
+ };
14167
+
13771
14168
  const idDocumentsListOutputSchema = zodOpenapi.z.object({
13772
14169
  totalCount: zodOpenapi.z.number(),
13773
14170
  idDocuments: zodOpenapi.z.array(idDocumentOutputSchema)
13774
14171
  });
13775
- const DOCUMENT_SIDE = ["front", "back"];
13776
- const idDocumentCreateInputSchema = zodOpenapi.z.object({
13777
- partyId: zodOpenapi.z.uuid(),
13778
- idDocType: zodOpenapi.z.enum(IdDocTypeZod),
13779
- idDocNumber: zodOpenapi.z.string(),
13780
- idDocHolderName: zodOpenapi.z.string(),
13781
- issueDate: zodOpenapi.z.coerce.date().optional(),
13782
- expirationDate: zodOpenapi.z.coerce.date().optional(),
13783
- issuer: zodOpenapi.z.string().optional(),
13784
- countryOfIssue: zodOpenapi.z.enum(generalCodes.COUNTRY_CODES_2).optional(),
13785
- idDocStatus: zodOpenapi.z.enum(IdDocStatusZod).optional()
14172
+ const paramsSchema$1 = zodOpenapi.z.object({
14173
+ partyId: zodOpenapi.z.uuid()
14174
+ });
14175
+ const arrayQuery = (schema) => zodOpenapi.z.preprocess((val) => {
14176
+ if (typeof val === "string") {
14177
+ return val.includes(",") ? val.split(",") : [val];
14178
+ }
14179
+ return val;
14180
+ }, schema.array()).optional();
14181
+ const querySchema = zodOpenapi.z.object({
14182
+ page: zodOpenapi.z.coerce.number().positive().default(1),
14183
+ limit: zodOpenapi.z.coerce.number().positive().default(20),
14184
+ sortColumn: zodOpenapi.z.string().default("updatedAt"),
14185
+ sortDirection: zodOpenapi.z.enum(["asc", "desc"]).default("desc"),
14186
+ [ALLOWED_ID_DOCUMENTS_FILTERS.PARTY_ID]: arrayQuery(zodOpenapi.z.uuid()),
14187
+ [ALLOWED_ID_DOCUMENTS_FILTERS.ISSUER]: arrayQuery(zodOpenapi.z.string()),
14188
+ search: zodOpenapi.z.string().optional()
14189
+ });
14190
+ const responseBodySchema$1 = zodOpenapi.z.object({
14191
+ message: zodOpenapi.z.string(),
14192
+ idDocumentsList: idDocumentsListOutputSchema
14193
+ });
14194
+ const getIdDocumentsListRoute = zodOpenapi.createRoute({
14195
+ method: "get",
14196
+ path: "/{partyId}/id-documents",
14197
+ summary: "List party ID documents",
14198
+ tags: ["Documents"],
14199
+ request: {
14200
+ params: paramsSchema$1,
14201
+ query: querySchema
14202
+ },
14203
+ responses: {
14204
+ 200: {
14205
+ description: "ID documents list fetched",
14206
+ content: {
14207
+ "application/json": {
14208
+ schema: responseBodySchema$1
14209
+ }
14210
+ }
14211
+ },
14212
+ 404: {
14213
+ description: "ID documents not found",
14214
+ content: {
14215
+ "application/json": {
14216
+ schema: zodOpenapi.z.object({ message: zodOpenapi.z.string() })
14217
+ }
14218
+ }
14219
+ },
14220
+ 500: {
14221
+ description: "Internal server error",
14222
+ content: {
14223
+ "application/json": {
14224
+ schema: zodOpenapi.z.object({ message: zodOpenapi.z.string() })
14225
+ }
14226
+ }
14227
+ }
14228
+ }
14229
+ });
14230
+ new zodOpenapi.OpenAPIHono().openapi(
14231
+ getIdDocumentsListRoute,
14232
+ async (context) => {
14233
+ const { partyId } = context.req.valid("param");
14234
+ const { sortColumn, sortDirection, limit, page, ...filters } = context.req.valid("query");
14235
+ const { data: idDocumentsList, error } = await context.env.MASTER_DATA_MANAGEMENT_SERVICE.getIdDocumentsList({
14236
+ pagination: {
14237
+ page,
14238
+ limit,
14239
+ sort: {
14240
+ column: sortColumn,
14241
+ direction: sortDirection
14242
+ },
14243
+ filterIdDocumentPartyId: partyId,
14244
+ ...filters
14245
+ }
14246
+ });
14247
+ if (!idDocumentsList || error) {
14248
+ return context.json({ message: "Could not list id documents" }, 404);
14249
+ }
14250
+ return context.json(
14251
+ {
14252
+ message: "ID documents listed successfully",
14253
+ idDocumentsList
14254
+ },
14255
+ 200
14256
+ );
14257
+ }
14258
+ );
14259
+
14260
+ const algParams = {
14261
+ RSA: {
14262
+ name: "RSASSA-PKCS1-v1_5",
14263
+ hash: { name: "SHA-256" }
14264
+ },
14265
+ EC: {
14266
+ name: "ECDSA",
14267
+ namedCurve: "P-256"
14268
+ },
14269
+ HMAC: {
14270
+ name: "HMAC",
14271
+ hash: { name: "SHA-256" }
14272
+ }
14273
+ };
14274
+ const verifyPayloadSignature = async ({
14275
+ signature,
14276
+ data,
14277
+ publicKey,
14278
+ algorithm = "RSA"
14279
+ }) => {
14280
+ const binaryPublicKey = Uint8Array.from(
14281
+ atob(publicKey),
14282
+ (c) => c.charCodeAt(0)
14283
+ );
14284
+ const format = algorithm === "HMAC" ? "raw" : "spki";
14285
+ const importedPublicKey = await crypto.subtle.importKey(
14286
+ format,
14287
+ binaryPublicKey,
14288
+ algParams[algorithm],
14289
+ false,
14290
+ ["verify"]
14291
+ );
14292
+ const encodedPayload = new TextEncoder().encode(data);
14293
+ const decodedSignature = Uint8Array.from(
14294
+ atob(signature),
14295
+ (c) => c.charCodeAt(0)
14296
+ );
14297
+ const isValid = await crypto.subtle.verify(
14298
+ algParams[algorithm],
14299
+ importedPublicKey,
14300
+ decodedSignature,
14301
+ encodedPayload
14302
+ );
14303
+ return isValid;
14304
+ };
14305
+
14306
+ const validateBearerScheme = (header) => {
14307
+ return header.startsWith("Bearer ") && header.length > 7 && !header.slice(7).includes(" ");
14308
+ };
14309
+ const extractBearerToken = (header) => {
14310
+ return header.slice(7).trim();
14311
+ };
14312
+ const validateBearerToken = (bearerToken) => {
14313
+ return zod.z.jwt().safeParse(bearerToken).success;
14314
+ };
14315
+
14316
+ const idempotency = () => {
14317
+ return factory.createMiddleware(async (context, next) => {
14318
+ if (!context.env.MIDDLEWARE_IDEMPOTENCY_DISABLED) {
14319
+ const idempotencyKeyHeader = context.req.header("x-idempotency-key");
14320
+ if (!idempotencyKeyHeader) {
14321
+ throw new httpException.HTTPException(401, {
14322
+ message: `The 'x-idempotency-key' header must exist and must have a value.`
14323
+ });
14324
+ }
14325
+ const existingIdempotencyRecord = await context.env.IDEMPOTENCY_KV.get(idempotencyKeyHeader);
14326
+ if (existingIdempotencyRecord) {
14327
+ throw new httpException.HTTPException(409, {
14328
+ message: "The identical request has already been processed. The idempotency key is not unique."
14329
+ });
14330
+ }
14331
+ await context.env.IDEMPOTENCY_KV.put(
14332
+ idempotencyKeyHeader,
14333
+ idempotencyKeyHeader,
14334
+ {
14335
+ expirationTtl: 60 * 60 * 24 * 3
14336
+ // 3 days
14337
+ }
14338
+ );
14339
+ context.set("idempotency", {
14340
+ key: idempotencyKeyHeader
14341
+ });
14342
+ }
14343
+ await next();
14344
+ });
14345
+ };
14346
+
14347
+ const jwt = () => {
14348
+ return factory.createMiddleware(async (context, next) => {
14349
+ if (!context.env.MIDDLEWARE_JWT_DISABLED) {
14350
+ const authorizationHeader = context.req.header("authorization");
14351
+ if (!authorizationHeader) {
14352
+ throw new httpException.HTTPException(401, {
14353
+ message: `The 'authorization' header must exist and must have a value.`
14354
+ });
14355
+ }
14356
+ if (!validateBearerScheme(authorizationHeader)) {
14357
+ throw new httpException.HTTPException(401, {
14358
+ message: `The 'authorization' header value must use the Bearer scheme.`
14359
+ });
14360
+ }
14361
+ const bearerToken = extractBearerToken(authorizationHeader);
14362
+ if (!validateBearerToken(bearerToken)) {
14363
+ throw new httpException.HTTPException(401, {
14364
+ message: `The Bearer token in the 'authorization' header value must be a JWT.`
14365
+ });
14366
+ }
14367
+ const { data, error } = await context.env.AUTH_SERVICE.verifyAccessToken({
14368
+ accessToken: bearerToken
14369
+ });
14370
+ if (!data || error) {
14371
+ throw new httpException.HTTPException(401, {
14372
+ message: "The JWT must contain valid user information."
14373
+ });
14374
+ }
14375
+ const rawUserMetaDataString = data.payload.user.rawUserMetaData;
14376
+ const rawUserMetaData = rawUserMetaDataString ? JSON.parse(rawUserMetaDataString) : null;
14377
+ const identityId = rawUserMetaData.organizationId ?? rawUserMetaData.exchangeOfficeId;
14378
+ if (!identityId) {
14379
+ throw new httpException.HTTPException(422, {
14380
+ message: "User data integrity check failed."
14381
+ });
14382
+ }
14383
+ context.set("identity", {
14384
+ ...data.payload,
14385
+ user: {
14386
+ ...data.payload.user,
14387
+ organizationId: rawUserMetaData.organizationId,
14388
+ exchangeOfficeId: rawUserMetaData.exchangeOfficeId
14389
+ }
14390
+ });
14391
+ }
14392
+ await next();
14393
+ });
14394
+ };
14395
+
14396
+ const signature = () => {
14397
+ return factory.createMiddleware(async (context, next) => {
14398
+ if (!context.env.MIDDLEWARE_SIGNATURE_DISABLED) {
14399
+ const signatureHeader = context.req.header("x-signature");
14400
+ if (!signatureHeader) {
14401
+ throw new httpException.HTTPException(401, {
14402
+ message: `The 'x-signature' header must exist and must have a value.`
14403
+ });
14404
+ }
14405
+ const signatureKeyHeader = context.req.header("X-Signature-Key");
14406
+ if (!signatureKeyHeader) {
14407
+ throw new httpException.HTTPException(401, {
14408
+ message: `The 'x-signature-key' header must exist and must have a value.`
14409
+ });
14410
+ }
14411
+ const payload = JSON.stringify(await context.req.json().catch(() => null));
14412
+ const identityContext = context.get("identity");
14413
+ const organizationId = identityContext.user.organizationId;
14414
+ const exchangeOfficeId = identityContext.user.exchangeOfficeId;
14415
+ const identityId = organizationId ?? exchangeOfficeId;
14416
+ if (!identityId) {
14417
+ throw new httpException.HTTPException(401, {
14418
+ message: "Failed to retrieve request identity ID."
14419
+ });
14420
+ }
14421
+ const { data: organization, error } = await context.env.ORGANIZATION_SERVICE.getOrganization({
14422
+ organizationId: identityId
14423
+ });
14424
+ if (!organization || error) {
14425
+ throw new httpException.HTTPException(404, {
14426
+ message: "Failed to retrieve organization."
14427
+ });
14428
+ }
14429
+ const signatureKey = organization.signatureKeys.filter(
14430
+ (signatureKey2) => signatureKey2.name === signatureKeyHeader
14431
+ )[0];
14432
+ if (!signatureKey) {
14433
+ throw new httpException.HTTPException(404, {
14434
+ message: "Signature key not found."
14435
+ });
14436
+ }
14437
+ const isVerified = await verifyPayloadSignature({
14438
+ signature: signatureHeader,
14439
+ publicKey: signatureKey.publicKey,
14440
+ data: payload
14441
+ });
14442
+ if (!isVerified) {
14443
+ throw new httpException.HTTPException(401, {
14444
+ message: "Invalid signature key or signature."
14445
+ });
14446
+ }
14447
+ }
14448
+ await next();
14449
+ });
14450
+ };
14451
+
14452
+ const paramsSchema = zodOpenapi.z.object({
14453
+ id: zodOpenapi.z.uuid()
13786
14454
  });
13787
14455
  const idDocumentUpdateInputSchema = zodOpenapi.z.object({
13788
14456
  partyId: zodOpenapi.z.uuid().optional(),
@@ -13797,11 +14465,89 @@ const idDocumentUpdateInputSchema = zodOpenapi.z.object({
13797
14465
  backImageUri: zodOpenapi.z.string().optional(),
13798
14466
  idDocStatus: zodOpenapi.z.enum(IdDocStatusZod).optional()
13799
14467
  });
13800
- const idDocumentMultipartSchema = zodOpenapi.z.object({
13801
- idDocument: zodOpenapi.z.string(),
13802
- documentSide: zodOpenapi.z.enum(DOCUMENT_SIDE),
13803
- file: zodOpenapi.z.any()
14468
+ const responseBodySchema = zodOpenapi.z.object({
14469
+ message: zodOpenapi.z.string(),
14470
+ idDocument: idDocumentOutputSchema
14471
+ });
14472
+ const updateIdDocumentRoute = zodOpenapi.createRoute({
14473
+ method: "put",
14474
+ path: "/{partyId}/id-documents/{id}",
14475
+ summary: "Update party document",
14476
+ tags: ["Documents"],
14477
+ middleware: [jwt, signature(), idempotency()],
14478
+ security: [{ JwtAuth: [] }],
14479
+ request: {
14480
+ headers: zodOpenapi.z.object({
14481
+ "X-Idempotency-Key": XIdempotencyKeyHeaderSchema,
14482
+ "X-Signature": XSignatureHeaderSchema,
14483
+ "X-Signature-Key": XSignatureKeyHeaderSchema
14484
+ }),
14485
+ params: paramsSchema,
14486
+ body: {
14487
+ content: {
14488
+ "application/json": {
14489
+ schema: idDocumentUpdateInputSchema
14490
+ }
14491
+ },
14492
+ required: true
14493
+ }
14494
+ },
14495
+ responses: {
14496
+ 200: {
14497
+ description: "ID document updated successfully",
14498
+ content: {
14499
+ "application/json": {
14500
+ schema: responseBodySchema
14501
+ }
14502
+ }
14503
+ },
14504
+ 404: {
14505
+ description: "ID document not found",
14506
+ content: {
14507
+ "application/json": {
14508
+ schema: zodOpenapi.z.object({ message: zodOpenapi.z.string() })
14509
+ }
14510
+ }
14511
+ },
14512
+ 500: {
14513
+ description: "Internal server error",
14514
+ content: {
14515
+ "application/json": {
14516
+ schema: zodOpenapi.z.object({ message: zodOpenapi.z.string() })
14517
+ }
14518
+ }
14519
+ }
14520
+ }
13804
14521
  });
14522
+ new zodOpenapi.OpenAPIHono().openapi(
14523
+ updateIdDocumentRoute,
14524
+ async (context) => {
14525
+ const { id } = context.req.valid("param");
14526
+ const patch = context.req.valid("json");
14527
+ const { data: existingDocument, error: fetchError } = await context.env.MASTER_DATA_MANAGEMENT_SERVICE.getIdDocument({ id });
14528
+ if (!existingDocument || fetchError) {
14529
+ return context.json({ message: "ID document not found" }, 404);
14530
+ }
14531
+ const fullIdDocument = {
14532
+ ...existingDocument,
14533
+ ...patch,
14534
+ id
14535
+ };
14536
+ const { data: updatedIdDocument, error: updateError } = await context.env.MASTER_DATA_MANAGEMENT_SERVICE.updateIdDocument({
14537
+ idDocument: fullIdDocument
14538
+ });
14539
+ if (!updatedIdDocument || updateError) {
14540
+ return context.json({ message: "Could not update ID document" }, 500);
14541
+ }
14542
+ return context.json(
14543
+ {
14544
+ message: "ID document updated successfully",
14545
+ idDocument: updatedIdDocument
14546
+ },
14547
+ 200
14548
+ );
14549
+ }
14550
+ );
13805
14551
 
13806
14552
  const messageResponseSchema = zodOpenapi.z.object({
13807
14553
  message: zodOpenapi.z.string()
@@ -13832,6 +14578,6 @@ exports.messageResponseSchema = messageResponseSchema;
13832
14578
  exports.partiesOutputDataSchema = partiesOutputDataSchema;
13833
14579
  exports.partyCreateOutputSchema = partyCreateOutputSchema;
13834
14580
  exports.partyOutputSchema = partyOutputSchema;
13835
- exports.partySchema = partySchema;
14581
+ exports.partySchema = partySchema$1;
13836
14582
  exports.partyUpdateInputSchema = partyUpdateInputSchema;
13837
14583
  exports.updatePartyOuputSchema = updatePartyOuputSchema;